扩展

在Bash中,存在多种扩展(expansion)机制,这些机制用于在命令执行前对文本进行解析和转换。以下是一些主要的Bash扩展类型:

命令替换(Command Substitution)

使用$(command)或反引号`command`来执行命令,并将命令的输出替换到原始命令中。

script_name=`basename $0` # 等价于 script_name=$(basename $0)
echo "The name of this script is $scirpt_name."
rm `cat filename`   # "filename" 中包含了一系列需要被删除的文件名。
#
# S.C. 指出这样写可能会导致出现 "arg list too long" 的错误。
# 更好的写法应该是 xargs rm -- < filename
# ( -- 可以在 "filename" 文件名以 "-" 为开头时仍旧正常执行 )

textfile_listing=`ls *.txt`
# 变量中包含了当前工作目录下所有的名为 *.txt 的文件。
echo $textfile_listing

textfile_listing2=$(ls *.txt)   # 命令替换的另一种形式。
echo $textfile_listing2
# 结果相同。

# 这样将一系列文件名赋值给一个单一字符串可能会出现换行。
#
# 而更加安全的方式是将这一系列文件存入数组。
#      shopt -s nullglob    # 设置后,如果没有匹配到文件,那么变量会被赋值为空。
#      textfile_listing=( *.txt )
#
# 感谢 S.C.

分隔符(空格、换行符等)和命令扩展注意事项:

# 空格注意事项
function display_params_count() {
    echo "$#"
}
display_params_count `echo a b` # 输出2
display_params_count "`echo a b`" # 输出1
display_params_count `echo` # 没有参数,输出0
display_params_count "`echo`" # 一个空参数 输出1

# 换行符注意事项
//TODO

参数扩展(Parameter Expansion)

  • 用于访问和修改变量值的操作。例如,字符串切片、长度、替换等。
  • 常见的参数扩展操作符有${var#pattern}(删除最短匹配的前缀)、${var%pattern}(删除最短匹配的后缀)、${var/pattern/replacement}(替换第一个匹配项)、${var//pattern/replacement}(替换所有匹配项)等。

算术扩展(Arithmetic Expansion)

  • 使用$((expression))来执行算术运算。

大括号扩展(Brace Expansion)

  • 使用{item1,item2,...}来生成字符串或序列的集合。
  • 也可以用于序列扩展,如{1..10}将扩展为1 2 3 … 10。

文件名扩展(Filename Expansion 或 Globbing)

  • 允许使用通配符(如*?[seq])来匹配文件名。
  • 常见的通配符有*(匹配任意字符序列)、?(匹配任意单个字符)、[abc](匹配方括号中任意单个字符)等。

波浪线扩展(Tilde Expansion)

  • 使用~来代表当前用户的主目录,或者~username来代表指定用户的主目录。

7. 变量扩展修饰符(Modifiers for Parameter Expansion)

  • 在参数扩展中使用的修饰符,如${#var}(获取变量长度)、${var:offset:length}(字符串切片)、${var^^}(转换为大写,Bash 4.0+)、${var,,}(转换为小写,Bash 4.0+)等。

引号(Quoting)

  • 使用单引号'、双引号"、反引号`和反斜杠\来控制字符串的扩展和转义。

进程替换(Process Substitution)

  • 使用<(command)>(command)来生成文件名,这些文件名指向由command产生的输出或接收其输入的FIFO(命名管道)。

正则表达式(Regular Expressions)

- Bash支持使用正则表达式进行模式匹配,但正则表达式本身不是一种扩展类型,而是在某些命令(如`grep`、`sed`、`awk`)和参数扩展中使用。
  1. 函数定义(Function Definition)
    • 虽然函数定义本身不是一种扩展,但Bash允许定义函数并在脚本中调用它们,从而扩展了脚本的功能。
  2. 数组(Arrays)
    • Bash支持一维数组,并提供了对数组进行操作的扩展语法。

这些扩展为Bash提供了丰富的文本处理和命令执行能力,使得Bash脚本编写更加灵活和强大。