UNIX 新手指南: 一些很好的 Shell 诀窍
Hello, world$ echo # This will not output$ echo 'But a hash (#) can be quoted'But a hash (#) can be quoted$ echo "# Even in double quotes"# Even in double quotes$
?
标志描述-a
导出所有已分配值的变量。-cVariable
执行从变量?中读取的命令。-e
当命令满足以下条件之一时立即退出:命令退出时返回比 0 大的值;命令不是?while
、until
?或?if
?结构的一部分;命令不经过?AND
?或?OR
?检测;或者命令不是管道前加感叹号。-f
禁用所有文件名替换。-h
定义函数时,定位和记住函数内部调用的所有命令。-i
指定交互式?Shell。-k
将所有关键字?都放入命令的环境。-n
读取命令,但是不执行它们。-r
调用受限制的?Shell。-s
从标准输入读取命令,然后将输出写入标准错误(不包括 Shell 内置命令的输出)。-t
读取并执行单个命令,然后退出。-u
在脚本中,将所有未定义?变量视为错误。当尝试变量替换时退出。-v
当读取输入行时将其显示出来。-x
在执行命令之前显示其完整命令(包括所有的参数和选项)。
?
运算符描述+
加-
减*
乘/
除%
求余<
小于(1 代表真,0 代表假)<=
小于等于(1 代表真,0 代表假)>
大于(1 代表真,0 代表假)>=
大于等于(1 代表真,0 代表假)<<
按位向左移位:将给定的整数或第一个表达式向左移动第二个表达式表示的位数>>
按位向右移位:将给定的整数或第一个表达式向右移动第二个表达式表示的位数?
Shell 有时自动生成自身的 Subshell,比如在管道中使用内置命令时。在 Subshell 中,Shell?$
?参数扩展到父 Shell 而不是 Subshell 的进程 ID (PID)。
?
现在尝试通过键入脚本的名称来执行它,如清单 19?中所示。
清单 19. vartest 脚本的输出
-eq
等于-ne
不等于-lt
小于-le
小于等于-gt
大于-ge
大于等于构造?while
?循环时,有一些注意事项需要牢记在心。首先,在条件与将它括起来的括号之间必须留有空白字符。其次,如果在条件中将变量用于数字比较,那么在?while
?语句之前必须首先定义该变量。
键入清单 26?中的文本以执行一个简短的?while
?循环:
清单 26. 使用 while 循环更改变量
?
如果键盘输入的词比变量个数多,那么依次为变量分配输入的词,到最后一个变量时,为其分配输入行余下的部分。(如果输入的词比变量个数少,那么为变量分配值直到所有的输入都已分配,然后为所有剩余的变量分配空值。)
File? 1010File? 1212File? 4242: no such file or directoryFile? Carriage return 10 11 12File? Control-C $
?
此技术通常在对循环的输入使用管道时使用。尝试键入清单 33?中的文本,该文本使用循环替代?ls
?命令的输出:
清单 33. 从管道读取
?
您可以在一个管道输入的?read
?中读取多个值,如清单 35?中所示。
清单 35. 从一个管道读取多个变量
将给定文件中所有十进制数的值以十六进制输出:
?
当您把它保存到可执行文件后(请参见创建 Shell 脚本部分),尝试运行该文件,如清单 37?中所示:
清单 37. baseconv 脚本的输出
$ ./baseconvInput base: 10Output base: 16Number: 3321Input base: 2Output base: 1100Number: 1015Input base: 16Output base: ANumber: ACA2762Input base: 10Output base: 10Number: Carriage return $
?
?
?
?
?
?
?
?