shell script循环语法与个别注意事项

shell 执行方式的区别:

1 ,直接执行 sh *.sh  ./*.sh  是开一个子进程来执行脚本,进程完成后,子进程的各项变量和操作会结束,不会传回到父进程中。

2,sourece *.sh 是在父(当前)进程中执行,脚本内设置的变量,也会继续有效。


利用 test 和 判断符号 [] 做判断

例: test -e /fileOrdir   && echo "exist" || echo "Not exist"    查看当前文件名是否存在 存在打印 exist  不存在 打印 Not exist

[ -z "$HOME" ]; echo "$?"   注:中括号两边必须有空格来分隔      


下面是一些 常用字符 所代表的意思, 不至test 、 [] 、shell 的循环和if 中也会用到  

linux括号的使用


shell script 的默认变量($0 , $1 ...)

$0 代表脚本名字   $1 代表脚本后面的第一个参数  $2 代表脚本后面的第二个参数

$# : 代表参数个数 包括脚本名字 $0

$@ : 代表全部变量

$* :大体同上

输入: sh sh07.sh  one two 

例: echo "The script name is  ===> $0"    # 输出 sh07.sh

echo "total param number is  ===> $#"  #输出 3

[ "$#" -lt 2 ] && echo "number of parameter is less than 2 stop here " && exit  #判断参数小于 2个 退出

echo "your whole param is ===> '$@' "   # 打印全部参数  one two three

echo "the 1st param is  ====> $1 "  ##打印打一个参数 one

echo "the 2ed param is ====> $2 " ##打印第二个参数 two


shift 可以造成参数偏移

sh sh08.sh one two three four five six

echo "total  param is ====> $#"    # 7

echo "your whole param is ====> '$@' "   # one two three four five six 

shift  # 进行一次偏移  后面可以带数字   shift 2  代表偏移两次 

echo "total  param is ====> $#"   6   偏移两次 5

echo "your whole param is ====> '$@' "  # two three four five six   偏移两次  three four five six 


条件判断式: 

if  ..... then

....

elif .... then

...

fi    #  if 的结束是 if 反过来 

例:

[ "$yn" == "Y" ] || [ "$yn" == "y" ];  等同  [ "$yn" == "Y" -o "$yn" == "y" ] (少个中扩号)

if [ "$yn" == "Y" ] || [ "$yn" == "y" ];then      # -o 等于 || (or)     -a 等于&& (and)   ! 非

echo "ok "

exit 0    #程序结束  返回 0  相当于return  如果用在函数的返回中需要用return   exit 将会退出程序 而不是退出函数

elif [ "$yn" == "N" -o "$yn" == "n" ]; then

echo "No"

exit 1   

fi


case  esac  (同语言的switch case语法)

case $变量名称 in 

"第一个选择项内容")

程序段

;;        两个;; 相当于 break

"第二个选择项内容")

程序段

;;        两个;; 相当于 break

*)相当于 define 其他的所有选项

程序段

;;

esac


输入: ./xxx.sh one

例:

case $1 in

"hehe")

echo "you input hehe"

;;

"one")

echo "you input one"

;;

*)

echo "you input other $1"

;;

esca


shell script 函数:

function fucName() {

程序段

}

例子函数参数:同一个脚本

function func()
{
if [ "$1" == "haha" ]; then
echo "$0"    #这里将打印 func
echo "sb bie haha"
elif [ "$1" == "hehe" ]; then
echo "hehe ni mei"
else
echo "exit"
return 0     #如果这里用 exit 将会直接退出程序  再不会到下面的while循环中
fi
}
while true 
do #do 必须另起一行
read -p "please input" name
func $name        #函数的变量 $0(函数名) $1(函数后面的第一个参数) ... 和 script shell 默认变量 $0(脚本名)  $1(脚本后面 输入的第一个参数)...    可以把shell          # script 想象成 特殊的函数   
   if [ "$?" == "0" ]; then   #如果运行脚本的返回         值 是 0 则退出程序
       exit 0 
     fi 
done


不同脚本之前的函数调用:

sh12.sh

function func()
{
	case $1 in 
		"one")
			echo "func one"
			;;
		"two")
			echo "func two"
			;;
		"three")
			echo "func three"
			;;
		*)
			echo "func sx"
			;;
	esac
	if [ "$2" == "haha" ]; then
		echo "haha nimei";
	elif [ "$2" == "hehe" ]; then
		echo "hehe doubi"
	elif [ "$2" == "exit" ]; then
		return 0
	elif [ "$2" == "" ]; then
		echo "input sb"
	fi
	return 1
}

sh13.sh  调用另一个脚本函数 先要载入 source  path/*.sh

source ${PWD}/sh12.sh
func $1 $2

if [ "$?" == "0" ]; then
echo "exit sb"
elif [ "$?" == "1" ]; then
echo "other input"
fi

循环:

while [条件] #条件成立则执行循环

do

程序段

done


until [条件] #条件成立则停止循环

do

程序段

done

# ! bin/sh
	if [ "$1" == "" ]; then
		echo "please input a param"
		exit 0
	fi
	s=0
	i=0
	until [ "$i" == "$1" ]          # 如果 i = 输入的第一个参数  则停止循环 
	do
		i=$(($i+1))		# i=$b 表示把变量b 赋值给变量i 注前面不带  $
		s=$(($s+$i))		# ((..)) 两个括号 表示取整数 里面可做运算
	done
	echo "The result of '1+2+...+$1 = $s'"

for var in con1 con2 ...

do

程序段

done

例:

for animal in dog cat elephant

do

echo "$animal" #第一次执行时 animal == dog 第二次为cat 第三次为 elephant

done


users= $(cut -d ":" -f1 /etc/passwd)

for username in $users

do

echo “$username” #会打印出所有的名字

done


for ( (初始值; 限制值; 执行步长) )

do

程序段

done

例:

s = 0

for ( (i=1; i <= $nu; I=i+1 ) )

do

s = $( ($s + $i) )

done

echo "the relust 0f 1+2+3+...+$nu is $s" #累加计算到输入的值

# !bin/sh
q="q"
w="w"
e="e"
r="r"
t="t"
y="y"
for var in q w e r t y
do
	echo  "$var "
done

if [ "$1" == "" ]; then	
	echo "please input param"
	exit 0
fi
for ((i=1;i<="$#";i=i+1))
do
	echo "the i param = $i"
done

users=$(cut -d ':' -f1 /etc/passwd) #取用户的第一列 用户名
i=0
for username in $users 
do
	i=$(($i+1))
	echo " $i = $username"
done

shell script 的追踪及调试

sh [-nvx] script.sh

-n 不执行script,只查询语法问题 若无语法错误 屏幕不会显示任何信息

-v 执行script前,先将script的内容输出到屏幕上

-x 将script的执行过程全显示到屏幕上,用户可以根据执行此看出执行那一段会出错,并修改自己的脚本。非常好的功能


多看,多模仿网上的相当有用的script,并加以修改成自己的script。是最快的学习手段。


学shell得主要目的是更方面的与操作系统打交道,做一些工具,或批处理,贴段与系统相关的操作

# !bin/sh
if [ ! -e "/zky/sh/hehe" ]; then
	echo "11111"
	touch hehe
	exit 0
else 
	if [ -f "/zky/sh/hehe" ]; then
		echo "22222"
		rm /zky/sh/hehe
		mkdir /zky/sh/hehe
		exit 0
	else
		echo "33333"
		rm -r /zky/sh/hehe
		touch /zky/sh/hehe
		exit 0
	fi
fi



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值