扩展
在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`)和参数扩展中使用。
- 函数定义(Function Definition)
- 虽然函数定义本身不是一种扩展,但Bash允许定义函数并在脚本中调用它们,从而扩展了脚本的功能。
- 数组(Arrays)
- Bash支持一维数组,并提供了对数组进行操作的扩展语法。
这些扩展为Bash提供了丰富的文本处理和命令执行能力,使得Bash脚本编写更加灵活和强大。