shell易错点总结

1.定义数组,中间不能用逗号,要用空格分隔
2.获取数组用大括号{array[index]}
3.获取数组元素个数为: ${#my_array[*]}
4.运算expr表达式,使用它能完成表达式的求值操作。
5.注意运算中使用的是反引号而不是单引号,完整的表达式要被 包含,这个字符不是常用的单引号,在 Esc 键下边。
6.表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
7. 条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== b] 是错误的,必须写成 [ $a == $b ]。
8.算术运算符的乘号()前边必须加反斜杠()才能实现乘法运算;expr $a \* $b ,注意在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "" 不需要转义符号 \。
9.关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
10.显示转义字符 echo "\"It is a test\""
11.echo -e "OK! \c" # -e 开启转义 \c 不换行
12.echo date 注意: 这里使用的是反引号, 而不是单引号。
13.printf format-string [arguments...] 带格式输出
14.默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。例如printf "Hello, Shell\n"
15.%s %c %d %f都是格式替代符

%-10s
指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。

16.如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替,例如printf “%s and %d \n” 显示:and 0
17.Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
18.sh的流程控制不可为空,就是else的内容不能不写
19.if流程控制写成单行需要加分号;
20.

if condition1
then 
	command1
elif
	condition2
then
	command2
else
	command3
fi
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

单行:for var in item1 item2 ... itemN; do command1; command2… done;
22.for 循环的in列表可以包含替换、字符串和文件名。
23.shell中的let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
例如:

age=10
while [ $age -lt 20]
do
	echo $age
	let "age++"
done

24.while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按结束循环。

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done

24.until 循环与 while 循环在处理方式上刚好相反。一般 while 循环优于 until 循环
25.case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至双分号 ;;。
26.case … esac 与其他语言中的 switch … case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

例如:

echo "请输入一个1-4的数字"
read aNUM
case $aNUM in
	1) echo "you select 1"
	;;
	2) echo "you select 2"
	;;
	3) echo "you select 3"
	;;
	4) echo "you select 4"
	;;
	*) echo "you false"
esac

27.无限循环方式:
无限循环语法格式:

while :
do
    command
done
或者:
while true
do
    command
done

或者

for (( ; ; ))

28.所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
29.函数返回值在调用该函数后通过 $? 来获得

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

30.注意,函数的参数获取,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
31.函数定义可以带function fun(){} 定义,也可以直接fun(){} 定义,不带任何参数。
32.函数的书写要注意缩进
33.重定向:

输出重定向>
追加重定向>>

34.如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null,/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
35.Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

格式1为. filename  ,注意点号(.)和文件名中间有一空格。
格式2位:source filename
发布了450 篇原创文章 · 获赞 120 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/ZZQHELLO2018/article/details/105329159