Linux Shell程式設計(24)——命令替換

尹成發表於2014-09-30
命令替換 將會重新分配一個命令[1]甚至是多個命令的輸出; 它會將命令的輸出如實地新增到另一個上下文中. [2]


使用命令替換的典型形式是使用後置引用(`...`). 後置引用形式的命令(就是被反引號括起來)將會產生命令列文字.
   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 $?


相關文章