1. 将Ubuntu 中默认的dash shell 修改为bash shell
sudo dpkg-reconfigure dash
然后选择no,就OK了。
可以在/bin目录下运行
ls -al s*
检查下sh是否链接到bash。
这样就可以防止出现写的有点bash语法,Ubuntu结果提示有问题,或者不认写的语法。
2.单引号和双引号都可以防止通配符扩展.
eg. echo "*.sh" 和 echo '*.sh' 都只打印出字符串的值,不会执行命令。
只不过是,单引号更严格一些,它可以防止任何变量扩展,双引号可以防止通配符扩展,但准许变量扩展。
eg. echo "$SHELL" 名利会执行, echo '$SHELL'不会执行。
注:还有一种防止这种扩展的方法,那就是使用转义字符 "\" ,在命令前加上
eg. \$SHELL 或者\.sh
3. shell 中select 语法和case 语法
select var in "begin" "end" "exit";
do
case $var in
"begin")
echo "starting..."
break;
;;
"end")
echo "stoping...."
break;
;;
"exit")
echo "exit"
break;
;;
*)
echo "ignore..."
break;
;;
esac
done
echo "Your have selected $var"
4. test vs [] vs [[]]
首先看下逻辑运算符:
&&
逻辑的 AND
||
逻辑的 OR
=
等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
!=
不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
<
小于 应用于:整型比较 在[] 中,不能使用 表示字符串
>
大于 应用于:整型比较 在[] 中,不能使用 表示字符串
-eq
等于 应用于:整型比较
-ne
不等于 应用于:整型比较
-lt
小于 应用于:整型比较
-gt
大于 应用于:整型比较
-le
小于或等于 应用于:整型比较
-ge
大于或等于 应用于:整型比较
-a
双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o
单方成立(or) 逻辑表达式 –o 逻辑表达式
-z
空字符串
-n
非空字符串
test命令
eg. if test 1 = 1 ; then echo 'ok'; fi
[] 表达式
eg.
1) [ 2 < 1 ] && echo 'ok'
ok
2) [ 2 -gt 1 -a 3 -lt 4 ] && echo 'ok'
ok
3) [ 2 -gt 1 && 3 -lt 4 ] && echo 'ok'
提示:-bash: [: missing `]'
注意:在[]表达式中,常见的>,<需要加转移字符,表示字符串大小比较,以acill码位置作为比较,不直接支持<,>运算符,还有逻辑算法符||, && 需要用-a ,-o 表示。
[[]] 表达式
eg.
1) [[ 2 < 3 ]] && echo 'ok'
ok
2) [[ 2 < 3 && 4 > 5 ]] && echo 'ok'
ok
注意:[[]]运算符只是[]运算符的扩充。能够支持<,>符号运算,不需要转义字符,它可以以字符串比较大小,并且,里面支持逻辑运算符.|| &&
3) [[ "acb" > "abc" ]] && echo "ok"
ok
如果对这三种进行性能比较的话,发现[[]]是最快的.
注意:不考虑对低版本bash和对sh的兼容的情况下,用[[]]是兼容性强,而且性能比较快,在做条件运算时,可以使用该运算符。但在[[]] 运算符中,不用使用-a 或者-o。
5.“(())”双括号运算符
语法:
((表达式1,表达式2,...))
功能:
1)在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。
eg.
a=1;((a++));echo $a;
2)在双括号结构中,所有变量可以不加: “$”符号前缀;
3) 双括号可以进行逻辑运算,四则运算符;
eg.
a=1;((a=a+1)); echo $a;
d=$((10+1, 10+2, 10+3)); echo $d
echo $((a>1?8:9))
4) 双括号结构 扩展了for, while, if 条件测试运算;
eg.
num=100;
total=0;
for((i=0;i<=num;i++));
do
((total+=i))
done
echo $total
或者
i=0;
total=0;
while((i<=num))
do
((total+=i,i++));
done
echo $total
或者
if ((total>=5050)); then
echo "ok"
fi
5) 支持多个表达式,各个表达式用","分开。
6.shell中变量的原形:${var},使用一个大括号来限定变量名称的范围。
eg. echo ${var}ccc
7.命令替换: $(cmd)
命令替换$(cmd)和符号`cmd`有相同之处
echo $(ls) 和 echo `ls` 等效
shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此标准输出放到原来命令echo $(ls) 中的$(ls)位置出,即替换了$(ls),再执行echo 命令。
注意:$(cmd)中的命令的错误输出是不会被替换的,替换的只是标准输出
8.一串的命令执行()和{}
()和{}都是对一串的命令进行执行,但有所区别:
1.()只是对一串命令重新开一个子shell进行执行,而{}对一串命令在当前shell执行
2.()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
3.()最后一个命令可以不用分号,并且()中各命令不必和括号有空格,而{}的第一个命令和左括号之间必须要有一个空格,并且{}最后一个命令要用分号
9.几种特殊的替换结构:${var:-string},${var:+string},${var:=string},${var:?string}
A. ${var:-string}和${var:=string}
${var:-string}: 若变量var为空,则用在命令行中用string来替换${var:-string}, 否则,变量var不为空时,则用变量var的值来替换${var:-string}
${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}中,若var为空时,用string替换${var:=string}的同时,把string赋给变量var。
B. ${var:+string}
${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
C. ${var:?string}
替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
eg. echo ${newvar:?没有设置newvar的值}
注意上面string不一定是常量,也可用另外一个变量或是命令的输出
eg.
echo ${var:-`date`}
echo ${var:-$(date)}
10. 四种模式匹配替换结构:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
${var%pattern}和${var%%pattern}表示从最右边(即结尾)匹配的,${var#pattern} 和${var##pattern}从最左边(即开头)匹配的。其中${var%pattern}和${var#pattern}是最短匹 配,${var%%pattern}和${var##pattern}是最长匹配。只有在pattern中使用了通配符才能有最长最短的匹配,否则没有最 长最短匹配之分。
可参考:http://blog.csdn.net/wangbole/article/details/8037048