bash扩展

来源:互联网 发布:tomcat连不上数据库 编辑:程序博客网 时间:2024/06/07 10:58

一、bash扩展的类型

    在命令执行前,会先对整个命令进行处理或者扩展。扩展共有7种类型,分别是花括号扩展、波浪线扩展、参数和变量扩展、算术扩展、命令替换、单词分割、路径名扩展。当存在多种类型扩展时,这个顺序也是扩展的执行顺序。只有花括号扩展、单词分割、路径名扩展会改变单词的数量。而其他扩展是一一替换。

二、花括号扩展

    花括号扩展主要用于生成任意的字符串。其格式是:

前缀{整数..整数}后缀前缀{单个字母..单个字母}后缀前缀{单词,单词,单词,单词...}后缀

    对于前面两个命令,还可以添加..整数,作为递增或递减的间隔,默认的间隔是1或-1。正常情况下,该扩展用于创建不存在的文件或者目录。而且花括号扩展是可以嵌套的,前缀后缀是可选的。可以通过echo看扩展情况。
    例子:
这里写图片描述

三、波浪线扩展

    这个比较简单,也就是~的使用。经常用来表示当前用户的主目录。如

cd ~/dir

    表示切换到当前主目录的dir目录下。

四、参数和变量扩展

    通常,通过${parameter}的方式引用变量,获取变量的值。但还有更多的变量扩展,下面word可以是某个变量或者命令替换或者算术扩展或者字符串:

变量 解释 ${parameter:-word} 获取变量的值,当变量的值没有设置时,返回word的内容 ${parameter:=word} 当变量不存在时,把word赋值给parameter并返回 ${parameter:offset:length} 获取参数从offset开始的length个字符 ${#parameter} 获取参数字符串的长度

五、算术扩展

    算术扩展主要是进行数学运算。格式如下:

$((expression))$[expression]

    第二种方法已经过时,不建议使用。expression会经历参数变换、命令替换和引号移除。算术扩展页支持嵌套。基本上C语言里面的操作符都可以使用,优先级大体一致,但要注意幂函数是**。可以使用括号来改变优先级。0开头或者0x(0X)开头来表示一个8进制数或者16进制数。参数扩展可以把$去掉,也就是里面引用的变量的$可以去掉,当名字有对应的变量时会利用变量的值,不存在的变量会用0替代。但是如果加了$,则变量必须存在,否则会出错。另外只能进行整数运算,浮点数不支持。
    示例:
这里写图片描述
    注意,在使用有赋值符号的操作符时,把$去掉,否则出错。

六、命令替换

    命令替换主要是执行命令,并替换为命令执行的输出结果。有两种格式:

$(command)`command`

    其中,第二个是比较旧的格式。在第一个中的字符全部不会特别对待,会被当成命令的一部分。而第二个可以有特殊的符号。
这里写图片描述
    从上文可以发现,当字符串含有多个连续的空格或者tab键时,单词分割会去掉多余的空白。这时如果在引用的命令外加上”“,空白就不会被去掉,而是保持原样。

七、单词分割

    在经过其他扩展后,会利用环境变量IFS中的字符对扩展的结果进行分割,从而去掉多余的IFS字符。不会分割双引号里面的字符串。不管IFS是什么,会去掉字符串开头和结尾的空白,然后使用IFS中的任何字符对字符串进行分割。

八、路径名扩展

    在单词分割过后,会对每个单词进行扫描。如果有包含*,?和[,则认为是一个模式,会对其进行特殊的解释。要使用这些特殊的字符作为字面字符,可以用\或者引号进行转义,这样就不会进行特殊处理了。匹配这些模式的是已经存在的文件名。注意与花括号扩展的区别,花括号扩展没有模式的概念,不会匹配已经存在的文件名。

特殊字符 匹配 * 任意字符串,包括空字符串 ? 任意的单个字符 [a-zA-Z] 多个字符对,匹配的是落在区间的单个字符。注意范围不一定是ASCII。 [[:class:]] 字符类,匹配落在这个区间的字符。class可以是alnum alpha,blank,digit,lower,upper,word xdigit

    我们可以通过echo命令来查看扩展后的内容,需要注意的是这里必须是完全匹配才行。示例

echo [[:upper:]]*

    输出当前以大写开头的任意文件或目录。

ls [[:upper:]]*

    这时将列出所有大写开头的文件或者大写开头的目录下的所有文件或目录。同时如果用[A-Z]替代[[:upper:]]将会列出所有的子项,这说明[A-Z]代表的不止大写字母,而取决于你本地化设置。

九、引号对扩展的影响

类型 作用 无引号 都起作用 双引号 抑制单词分割、路径名扩展、波浪线扩展、花括号扩展。参数扩展、算术扩展、命令替换有效。 单引号 抑制所有扩展
0 0