$ ls . > /tmp/tfile.txt
$ flist=`cat /tmp/tfile.txt`
$ echo $flist
a.txt b.txt c.txt
$ echo ${flist#* }
a.txt b.txt c.txt
為什么${flist#* }不能輸出b.txt c.txt?如何處理包含換行符的變數?
uj5u.com熱心網友回復:
${flist#* }擴展,但從開頭洗掉與 (asterisk space, 其中星號匹配零個或多個字符,空格匹配空格字符) 匹配$flist的最小部分。*
因此,它會從擴展中洗掉直到并包括第一個空格的字符。因此,在您的情況下,它會列印a.txt,然后看到一個空格并退出,從而不列印b.txtand c.txt。
如果你放echo "${line#*.txt}",那么輸出將是:
b.txt c.txt
請參閱此參考以了解#*bash。
uj5u.com熱心網友回復:
一般來說,shell 不是處理資料和修改變數的好工具。(不過,它是一個與 Unix 一起作業的好工具,繼續學習和使用它。)一些方言可以在某些方面解決這個問題,但要記住復雜的資料處理最好在 shell 之外完成,這仍然是一件好事。
大多數資料處理預計將使用外部工具而不是 shell 原語進行。
這里有幾種方法可以修剪您剛剛閱讀的檔案的第一個條目,最特殊的是:
omit_first_line()
{
tail -n 2 "$1"
}
flist=$(omit_first_line tfile.txt)
看看如何$(…)使用 來代替反引號,不鼓勵使用反引號,因為它們很難配對和參考。
還有很多其他工具可以為您跳過檔案中的第一行,例如sed或awk。
如果您正在處理檔案,您真的應該考慮使用 find 和 xargs,它們可以很好地協同作業,如
find . -type f -print0 | xargs -0 stat
要么
find . -type f -print | { while read filename; do printf 'Filename %s\n' "${filename}"; done }
一般來說,撰寫過濾器比處理串列更容易。您可以使用經典的命令式語言將資料存盤在串列中,而不是將資料存盤在串列中,將資料存盤在檔案中,每條記錄在單獨的行中,并在過濾器之間傳遞資料。如果您只能列印資料,則可能根本不需要將其存盤在檔案中。
現在,如果您有充分的理由在 shell 中處理您的串列,您可以使用位置引數:
gobble()
(
set -- "$@"
shift
echo "$@"
)
flist='a.txt b.txt c.txt'
flist=$(gobble ${flist})
echo ${flist}
uj5u.com熱心網友回復:
非常感謝依賴。最后,我通過重新分配來解決這個flist問題flist=`echo $flist`;。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/429499.html
