1.位置参数(positional parameter):命令行参数
2.export用于将变量放进系统环境里。环境变量是一个名称与值的简单列表,可供所有执行中的程序使用。新的进程会继承父进程的环境变量。
3.export -p:用于显示环境变量。
4.${varname:-word}:如果varname存在且非null,则返回其值,否则,返回word。
5.${varname:=word}:如果varname存在且非null,则返回其值,否则,设置它为word,并返回其值。
6.${varname:?message}:如果varname存在且非null,则返回其值,否则显示varname:message,并退出当前的命令或脚本。
7.${varname:+word}:如果varname存在且非null,返回word,否则返回null。
8.模式匹配运算符实例(注意是模式匹配而非正则表达式匹配):
8.1.path=/home/tolstoy/mem/long.file.name
8.2.1.${variable#pattern}:如果模式匹配于变量值的开头处,则删除匹配的最短部分,并返回剩下的部分。
8.2.2.${path#/*/}:tolstoy/mem/long.file.name
8.3.1.${variable##pattern}:如果模式匹配于变量值的开头处,则删除匹配的最长部分,并返回剩下的部分。
8.3.2.${path##/*/}:long.file.name
8.4.1.${variable%pattern}:如果模式匹配于变量值的结尾处,则删除匹配的最短部分,并返回剩下的部分。
8.4.2.${path%.*}:/home/tolstoy/mem/long.file
8.5.1.${variable%%pattern}:如果模式匹配于变量值的结尾处,则删除匹配的最长部分,并返回剩下的部分。
8.5.2.${path%%.*}:/home/tolstoy/mem/long
9.${#variable}:返回$variable值里的字符长度。
10.$#: 提供传递到Shell脚本或函数的参数总数。
10.1.示例:
while [ $# != 0 ]
do
case $1 in
...
esac
shift #移开第一个参数
done
11.$*,$@:一次表示所有的命令行参数。
12."$*":将所有命令行参数视为单个字符串。$IFS的第一个字符用来作为分割字符,以分隔不同的值来建立字符串。
13."$@":将所有命令行参数视为单独的个体,也就是单独的字符串,这样可以保留内嵌在每个参数里的任何空白。
14.set --:设置位置参数的值,并将之前存在的任何值丢弃。
15.POSIX内置的Shell变量
15.1.#:目前进程的参数个数。
15.2.@:传递给当前进程的的命令行参数。置于双引号内,会展开为个别的参数。
15.3.*:当前进程的命令行参数。置于双引号内,则展开为一单独参数。
15.4.-:在引用时给予Shell的选项。
15.5.?:前一命令的退出状态。
15.6.$:Shell进程的进程编号(process ID)。
15.7.0:Shell程序的名称。
15.8.!:最近一个后台命令的进程编号。
15.9.ENV:一旦引用,则仅用于交互式Shell中;$ENV的值是可展开的参数。
15.10.HOME:家目录。
15.11.IFS:内部的字符分隔器。
15.12.LANG:当前locale的默认名称,其他的LC_*变量会覆盖其值。
15.13.LC_ALL:当前locale的名称;会覆盖LANG和其他LC_*变量。
15.14.LC_COLLATE:用来排序字符的当前locale名称。
15.15.LC_CTYPE:在模式匹配期间,用来确定字符类别的当前locale的名称。
15.16.LC_MESSAGES:输出信息的当前语言的名称。
15.17.LINENO:刚执行过的行在脚本或函数内的行编号。
15.18.PS1:主要的命令提示字符串。默认为“$”。
15.19.PS2:行继续的提示字符串。默认为“>”。
15.20.PS4:以set -x设置的执行跟踪的提示字符串。默认为“+”。
16.特殊变量$$可在编写脚本时用来建立具有唯一性的文件名。
17.算术运算符:
17.1. ++ -- :自增和自减
17.2. + - ! ~:正负号;逻辑与位的取反
17.3. * / %:乘法、除法、取余数
17.4. + -:加法和减法
17.5. << >>:向左位移、向右位移
17.6. < <= > >=:比较
17.7. == !=:相等与不等
17.8. &:位运算的AND
17.9. ^:位运算的Exclusive OR
17.10. |:位运算的OR
17.11. &&:逻辑的AND
17.12. ||:逻辑的OR
17.13. ?::条件表达式
17.14. = += -= *= /= %= &= ^= <<= >>= |=:赋值运算符
18.对于逻辑AND和OR运算符而言,任何非0值函数都为真。
19.Shell算数运算:$((...))
20.每一条命令,不管是内置的、Shell函数、还是外部的,当它退出时,都会返回一个小的整数值给引用它的程序,这就是程序的退出状态。
21.依照惯例,退出状态0表示成功,其它均为失败。
22.if pipeline
[ pipeline ... ]
then
statements-if-true-1
[ elif pipeline
[ pipeline ... ]
then
statements-if-true-2
...]
[ else
statements-if-all-else-fails ]
fi
22.test命令的另一种形式:[ ... ]
23.test表达式
string 判断string是否为null
-b file 判断file是否为块设备文件
-c file 判断file是否为字符设备文件
-d file 判断file是否为目录
-e file 判断file是否存在
-f file 判断file是否为一般文件
-g file -u file 判断file是否设置了它的setid位
-h file -L file 判断file似乎否为符号连接
-n string 判断string是否为null
-p file 判断file是否为一命名的管道
-r file 判断file是否为可读的
-S file 判断file是否为socket
-s file 判断file是否为空
-t n 判断文件描述符n是否指向一个终端
-w file 判断file是否可写
-x file 判断file是否可执行,或file是否为可查找的目录
-z string 如果string为null, 返回真
s1 = s2 字符串s1与s2相同
s1 != s2 字符串s1不等与s2
n1 -eq n2 整数,n1 = n2
n1 -ne n2 整数,n1 != n2
n1 -lt n2 整数,n1 < n2
n1 -gt n2 整数,n1 > n2
n1 -le n2 整数,n1 <= n2
n1 -ge n2 整数,n1 >= n2
24.在test表达式前使用!表示取反。
25.多个test表达式之间可以用-a(AND)和-o(OR)连接。
26.test最佳实践:
26.1.确保test表达式中的变量都用引号括起来,如:if[ -f "$file" ] ...
26.2.如果字符串值为空,或是开头带有一个减号,则test命令会被混淆,所以,可以在字符串前置字母X,如:if [ "X$answer" = "Xyes" ] ...
26.3.test只能处理整数比较,不能处理浮点数比较。
27.case语法:
case $1 in
-f)#模式匹配
...
;;#执行程序到此为止
-d | --directory)#支持OR
...
;;
*)#作为默认情况
echo $1: unknown option >$2#返回到标准错误
exit 1
esac
28.for语法:
for i in atlbrochure*.xml
do
echo $i
mv $i $i.old
sed 's/atlanta/&, the capital of the South/' < $i.old > $i
done
28.1.for循环的in列表是可选的,如果省略,Shell循环会遍历整个命令行参数。
29.while语法:
while condition
do
statements
done
30.until语法:
until condition
do
statements
done
31.break,跳出循环;continue,结束当前循环进入下次循环。
32.函数在使用之前必须定义,函数可以定义在脚本的起始处,也可以将它们放在另一个独立的文件里,然后以点号(.)命令来取用(source)他们。
33.在函数体里,位置参数都是函数的参数。父脚本的参数会临时地被函数参数所隐藏,$0为父脚本的名称。
34.在Shell函数体里使用exit,会终止整个shell脚本。
35.函数如果没有提供局部变量,则所有函数都与父脚本共享变量。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21038673/viewspace-709751/,如需转载,请注明出处,否则将追究法律责任。