shell脚本学习指南[二](Arnold Robbins & Nelson H.F. Beebe著)

2019-09-23 09:42:16于海丽

"$*" 表示将所有命令行参数视为单个字符串,等同于”$1 $2 ..."。$IFS的第一个字符用来作为分隔字符,以分隔不同的值来建立字符串。
“$@" 将所有命令行参数视为单独的个体,也就是单独字符串。等同于"$1" "$2" ...。这是将参数传递给其他程序的最佳方式,因为它会保留所有内嵌在每个参数里的任何空白。

shift命令是用来“截去(lops off)”来自列表的位置参数,由左开始。一旦执行shift,$1的初始值会永远消失,取而代之的是$2的旧值。$2的值变成$3的旧值,以此类推。$#值则会逐次减一。以上几个要多实验,不再赘述。

类似的还有很多特殊变量:(所有引用特殊变量前边加$符号)
# 目前进程的参数个数
@传递给当前进程的命令行参数。置于双引号内,会展开为个别的参数。
* 当前进程的命令行参数。置于双引号内,则展开为一单独参数。
- 在引用时给予shell的选项。
? 前一个命令的退出状态
$ shell进程的进程编号 process ID
0(零) shell程序的名称
! 最近一个后台命令的进程编号
ENV 一旦引用,则仅用于交互式shell中。$ENV的值是可展开的参数。
HOME 根目录
IFS 内部的字段分隔器,想想awk吧。
LANG 当前locale的默认名称;其他的LC_*变量会覆盖其值
LC_ALL 当前locale的名称,会覆盖LANG与其他LC_*变量
LC_COLLATE 用来排序字符的当前locale名称
LC_CTYPE 再模式匹配期间,用来确定字符类别的当前locale的名称
LC_MESSAGES 输出信息的当前语言的名称
LINENO 刚执行过的行再脚本或函数内的行编号
NLSPATH 再$LC_MESSAGES(XSI)所给定的信息语言里信息目录位置。
PATH 命令的查找路径
PPID 父进程的进程编号
PS1 主要的命令提示字符串,默认为“$”
PS2 行继续的提示字符串,默认为"> "
PS4 以set -x设置的执行跟踪的提示字符串。默认为“+ ”。
PWD 当前工作目录。

shell的算数运算符基本跟C语言一样,想直接在命令行测试算数运算符的需要这样加双括号:echo $(( 3&4 )) 之类的。

有一个要知道的地方,每一条命令,不管是内置的、shell函数,还是外部的,当它退出时,都会返回一个小的整数值给引用它的程序,这就是大家所熟悉的程序的退出状态(exit statu)。在shell下执行进程时,有许多方式可取用程序的退出状态。惯例来讲,退出状态为0表示成功执行完成,其他状态都是失败的。可以用ls命令执行对一次错一次分别看看返回状态是多少(上边有讲特殊变量 $? 可查看上一条命令的返回状态)。

POSIX的结束状态:
0 命令成功地退出
>0 在重定向或单词展开期间(~,变量,命令,算符展开,单词切割)失败。
1-125 命令不成功地退出,具体含义由各个单独的命令定义。