使用命令替换的典型形式是使用后置引用(`...`). 后置引用形式的命令(就是被反引号括起来)将会产生命令行文本.
1 script_name=`basename $0`
2 echo "The name of this script is $script_name."
这样的话, 命令的输出可以被当成传递到另一个命令的参数, 或者保存到变量中, 甚至可以用来产生for循环的参数列表.
rm `cat filename` # "filename" 包含了需要被删除的文件列表. textfile_listing=`ls *.txt` # 变量中包含了当前工作目录下所有的*.txt文件. echo $textfile_listing textfile_listing2=$(ls *.txt) # 这是命令替换的另一种形式. echo $textfile_listing2 # 同样的结果. # 将文件列表放入到一个字符串中的一个可能的问题就是 # 可能会混进一个新行. # # 一个安全的将文件列表传递到参数中的方法就是使用数组. # shopt -s nullglob # 如果不匹配, 那就不进行文件名扩展. # textfile_listing=( *.txt )
例子:找anagram
#!/bin/bash # 关于命令替换嵌套的例子. E_NOARGS=66 E_BADARG=67 MINLEN=7 if [ -z "$1" ] then echo "Usage $0 LETTERSET" exit $E_NOARGS # 脚本需要一个命令行参数. elif [ ${#1} -lt $MINLEN ] then echo "Argument must have at least $MINLEN letters." exit $E_BADARG fi FILTER='.......' # 必须至少有7个字符. # 1234567 Anagrams=( $(echo $(anagram $1 | grep $FILTER) ) ) # | | 嵌套的命令替换 | | # ( 数组分配 ) echo echo "${#Anagrams[*]} 7+ letter anagrams found" echo echo ${Anagrams[0]} # 第一个anagram. echo ${Anagrams[1]} # 第二个anagram. # 等等. # echo "${Anagrams[*]}" # 在一行上列出所有的anagram . . . exit $?