第二部分 进阶1. 变量重游- 内建变量:
- $BASH :Bash的二进制程序文件的路径
- $BASH_VERSION: bash version
- $DIRSTACK: 在目录栈中最顶端的值.
- $EDITOR :脚本所调用的默认编辑器,
通常情况下是vi或者是emacs.
- $EUID :euid
- $GROUPS :目前用户所属的组
- $HOME :用户的home目录, 一般是/home/username
- $HOSTNAME: hostname放在一个初始化脚本中,
在系统启动的时候分配一个系统名字.
- $HOSTTYPE: 主机类型
$IFS: Internal Field Separator,这个变量用来决定Bash在解释字符串时如何识别域, 或者单词边界.- $IGNOREEOF :忽略EOF: 告诉shell在log out之前要忽略多少文件结束符(control-D).
- $LINENO :这个变量用来记录自身在脚本中所在的行号.
- $OLDPWD :之前的工作目录("OLD-print-working-directory",
就是之前你所在的目录)
- $OSTYPE :操作系统类型
- $PATH :可执行文件的搜索路径,
一般为/usr/bin/,/usr/local/bin
- $PPID :进程的
$PPID就是这个进程的父进程的进程ID - $PS1 :prompt string,这是主提示符, 可以在命令行中见到它.
- $PS2 :第二提示符, 当你需要额外输入的时候, 你就会看到它. 默认显示">". 还有PS3/4...
- $PWD :工作目录(你当前所在的目录)
- $TMOUT :如果$TMOUT环境变量被设置为非零值time的话,
那么经过time秒后, shell提示符将会超时.
这将会导致登出(logout).
- $*: 所有的位置参数都被看作为一个单词.
- $@: 与$*相同, 但是每个参数都是一个独立的引用字符串,
参数是被完整传递的
- $! :运行在后台的最后一个作业的PID(进程ID)
- $_ :这个变量保存之前执行的命令的最后一个参数的值
- $$: 脚本自身的进程ID.
- 其他的通过 man bash查吧。
- 操作字符串
- 字符串长度: ${#string}; expr length $string; expr "string":'.*'
- 匹配字符串开头的子串长度:
- expr math "$string" '$substr'
- expr "$string":'$substr' ##substr是正则表达式
- 索引: expr index $string $substr: 在字符串$string中所匹配到的$substr第一次所出现的位置.
- 提取子串:
- ${string:position} :在$string中从位置$position开始提取子串.
- ${string:(-position)}: 从右边开始提取子串,()不能少!
- ${string:position:length}: 在$string中从位置$position开始提取$length长度的子串.
- ${*:position:length} :如果
$string参数是"*"或"@",
那么将会从$position位置开始提取$length个位置参数,
但是由于可能没有$length个位置参数了,
那么就有几个位置参数就提取几个位置参数.
- 字串消除:
- ${string#substr} :从$string的开头位置截掉最短匹配的$substr.
- ${string##substr} :从$string的开头位置截掉最长匹配的$substr.
- ${string%substr} :从$string的结尾位置截掉最短匹配的$substr.
- ${string%%substr} :从$string的结尾位置截掉最长匹配的$substr.
- 字串替换:
- ${string/substring/replacement}: 使用$replacement来替换第一个匹配的$substring.
- ${string//substring/replacement}: 使用$replacement来替换所有匹配的$substring.
- ${string/#substring/replacement}: 如果$substring匹配$string的开头部分,
那么就用$replacement来替换$substring.
- ${string/%substring/replacement}:如果$substring匹配$string的结尾部分,
那么就用$replacement来替换$substring.
- Bash脚本也可以调用awk的字符串操作功能来代替它自己内建的字符串操作.
- 参数替换
- 参数扩展(替换):
- ${parameter} : 等同于$parameter
- ${parameter-default} :如果变量parameter没被声明, 那么就使用默认值. eg: echo ${username-`whoami`} 当username没有定义时输出`whoami`的值,但是要注意的是,只是username的值还是为空
- ${parameter:-default} :如果变量parameter没被设置, 那么就使用默认值. ${parameter-default}
和${parameter:-default}在绝大多数的情况下都是相同的.
只有在parameter已经被声明, 但是被赋null值得时候,
这个额外的:才会产生不同的结果.
- ${parameter=default} :如果变量parameter没声明, 那么就把它的值设为default.
- ${parameter:=default} :如果变量parameter没设置, 那么就把它的值设为default.
- ${parameter+alt_value} :如果变量parameter被声明了,
那么就使用alt_value, 否则就使用null字符串.
- ${parameter:+alt_value} :如果变量parameter被设置了,
那么就使用alt_value, 否则就使用null字符串.
- 变量扩展/子串替换 (跟字符串的操作一样)
- 指定变量类型:
- declare/typeset选项
- -r 只读 (declare -r var1与readonly var1是完全一样的)
- -i 整型
- -a 数组
- -f 函数 :如果在脚本中使用declare -f, 而不加任何参数的话, 那么将会列出这个脚本之前定义的所有函数.
- -x export :这句将会声明一个变量, 并作为这个脚本的环境变量被导出.
- -x var=$value :declare命令允许在声明变量类型的同时给变量赋值.
- 变量的间接引用:
- 假设一个变量的值是第二个变量的名字.
那么我们如何从第一个变量中取得第二个变量的值呢?
比如, 如果a=letter_of_alphabet并且letter_of_alphabet=z,
那么我们能够通过引用变量a来获得z么?
这确实是可以做到的, 它被称为间接引用.
它使用eval var1=\$$var2这种不平常的形式.
- $RANDOM产生随机数:
$RANDOM是Bash的内部函数(并不是常量),
这个函数将返回一个伪随机整数, 范围在0 - 32767之间.- /dev/urandom设备文件提供了一种比单独使用$RANDOM更好的, 能够产生更加"随机"的随机数的方法.
dd if=/dev/urandom of=targetfile
bs=1 count=XX能够产生一个很分散的伪随机数序列.然而, 如果想要将这个数赋值到一个脚本文件的变量中, 还需要可操作性,
比如使用od命令或者dd命令
- ((...))
- 与let命令很相似,
((...))结构允许算术扩展和赋值.
举个简单的例子, a=$(( 5 + 3 )),
将把变量"a"设为"5 + 3", 或者8.
然而, 双圆括号结构也被认为是在Bash中使用C语言风格变量操作的一种处理机制.
|
|