在sh里取变量前面要加上$符号:echo $变量名
单引号、双引号都扩字符串。但双引号扩的是一个变量会展开。
变量1=(${变量2//字符/空格})
if [ 条件 ]
then 条件为真执行该语句
else 条件为假执行该语句
fi
(if 冒号:在sh里表示恒久为真)
if [ 条件1 ]
then 条件一满足执行的语句
elif[ 条件2 ]
then 条件2为真执行该语句
else 条件12均为假执行该语句
fi
case命令可类比C语言的switch/case语句,esac表示case语句块的结束。
case "$1" in
start)
...变量$1等于start执语句行
;; 相当于break
stop)
...变量$1等于stop执语句行
;;
reload | force-reload)
...变量$1等于reload执语句行
;;
restart)
...
*)
log_success_msg "Usage: nfs-kernel-server {start|stop|status|reload|force-reload|restart}"
exit 1
;;
esac
Shell脚本的for循环结构和C语言很不一样,它类似于某些编程语言的foreach循环。例如:
#! /bin/sh
for FRUIT in apple banana pear; do
echo "I like $FRUIT"
done
FRUIT是一个循环变量,第一次循环$FRUIT的取值是apple,第二次取值是banana,第三次取值是pear。再比如,要将当前目录下的chap0、chap1、chap2等文件名改为chap0~、chap1~、chap2~等(按惯例,末尾有~字符的文件名表示临时文件),这个命令可以这样写:
$ for FILENAME in chap?; do mv $FILENAME $FILENAME~; done
while的用法和C语言类似。比如一个验证密码的脚本:
#! /bin/sh
echo "Enter password:"
read TRY
while [ "$TRY" != "secret" ]; do
echo "Sorry, try again"
read TRY
done
和C语言类似,Shell中也有函数的概念,但是函数定义中没有返回值也没有参数列表。例如:
#! /bin/sh
foo(){ echo "Function foo is called";}
echo "-=start=-"
foo
echo "-=end=-"
注意函数体的左花括号‘{‘和后面的命令之间必须有空格或换行,如果将最后一条命令和右花括号‘}‘写在同一行,命令末尾必须有;号。
在定义foo()函数时并不执行函数体中的命令,就像定义变量一样,只是给foo这个名字一个定义,到后面调用foo函数的时候(注意Shell中的函数调用不写括号)才执行函数体中的命令。Shell脚本中的函数必须先定义后调用,一般把函数定义都写在脚本的前面,把函数调用和其它命令写在脚本的最后(类似C语言中的main函数,这才是整个脚本实际开始执行命令的地方)。
Shell函数没有参数列表并不表示不能传参数,事实上,函数就像是迷你脚本,调用函数时可以传任意个参数,在函数内同样是用$0、$1、$2等变量来提取参数,函数中的位置参数相当于函数的局部变量,改变这些变量并不会影响函数外面的$0、$1、$2等变量。函数中可以用return命令返回,如果return后面跟一个数字则表示函数的Exit Status。
原文:https://www.cnblogs.com/SutCoderHang/p/9932363.html