bash 常用的基本常识

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

你可能感兴趣的:(bash 常用的基本常识)