0. man bash可以看到很多很多
1. 变量与变量值(展开)
如果你需要的是变量名,直接使用变量名;如果你需要的是变量值,使用$符号。例如:
export PATH=/home/bin:$PATH
如果你不确定是要变量还是展开的变量值,那么试着展开下代入表达式看看对不对头。
一般来说,需要左值的地方(给变量赋值)直接用变量名;需要右值的地方(取变量的值)加$符号。
2. 变量赋值,等于号前后不要加空格(加空格的形式用于变量比较)。
3 隔开变量和后缀:
${go}ing
注意不要{$go}ing
4. shell通配符和引号
4.1 没有引号
例如ls *.*,shell会将*.*展开为当前目录下所有文件,然后传递给 ls。
4.2 双引号
如果你用ls "*.*",shell会将*.*原样传递给ls,ls就会告诉你没有哪个文件的文件名是*.*
但是,如果双引号内存在$符号,shell还是会解释。
4.3 单引号
好了,现在连$也不解释了。
5. C风格表达式
#!/bin/bash
var=2 # 默认变量类型是string,不能直接进行数学运算
echo $((var * var)) # ((C stype expression)),放在两个小括号内,可以在运算符前后加空格,取变量var的值不需要$,计算得到的新(临时?)变量仍然用$引用交给echo
echo $var # var的值还是2,没有改变。如果上一行是$((var++)),那这一行就是3了。
6. if条件语句
在shell中,if、[、]等都是内置命令,所以if和[之间以及[]和条件之间都需要用空格分开,避免解释器将if[解释为一条命令。同样的理由,if语句和then语句要分两行或以分号隔开,避免解释器将then认作是if的参数(虽然then不是内置命令)。
if [ -f testfile ] then # do something fi #或者这样写 if [ -f testfile ]; then #do something fi
上面程序可简写为:
[ -f testfile ] && do_something
||符号也是也可以这么用的:
[ -f testfile ] || { echo "oops!"; exit 1; }
同样需注意空格问题:[]和||和{}之间;{}内侧;分号后面。原因都是为了告知bash,命令或参数已结束。注意大括号内部的命令,每条后面都要加分号。
更多结束:[]内部语句相当于一个测试表达式,有返回值。因此你可以用if判断这个返回值,也可以让bash判断这个返回值。
6.1 字符串比较
# "=="符号前后加空格
# 两个字符串都用引号包围
# 否则当$str未定义时会发生问题
if [ "$str" == "string" ]; then # do something fi
字符串比较时,两个字符串都用引号包围。script在执行前,变量会被替换为其真正的值,因此,若变量不存在,那么不加引号的if [ $str == “what” ]会在执行前被替换为if [ == "what"]。
使用-z "string" (string is Empty)或-n (string is Not empty)时同样需加引号,否则[ -z $a ]就可能会被替换为[ -z ]。而根据bash规则,无参数测试总是为true(?)。因此,若$a为空,那么[ -z $a ]和[ -n $a ]测试将同时成立。
既然可以使用==,那么在需要时也可以使用!=、>、<。注意>和<都是shell特殊字符,因此需要加转义:
[ "a" < "b" ] && echo "char a is less then char b"
6.2 数值比较
数值比较使用-eq、-ne、-gt、-lt、-ge、-le。
7. 其他测试选项
使用help test可以查看所有可用测试选型。
8. 在当前shell环境中执行script
source your_script
或者
. your_script
以上,your_script不需要x权限。
9. 引用命令执行结果
两种形式:
echo $(find . -name "*.c")
echo `find . -name *.c`
10. cp file file.orig
可以用如下形式:
cp $file{,.orig}
$var{.a,.b,.c,.d}将被展开为
${var}.a ${var}.b ${var}.c ${var}.d
逗号前后不能有空格。