這個問題在這里已經有了答案: 我剛剛分配了一個變數,但是 echo $variable 顯示了其他東西 (7 個答案) 49 分鐘前關閉。
我正在撰寫一個腳本來處理資料檔案,并從這兩個命令列開始:
proc(){ echo $1 ; }
while read -r line ; do proc "$line"; done <data.csv | less
令我驚訝的是,我在輸出的中間找到了當前目錄的串列,并意識到它出現在資料檔案包含星號字符的位置。
擴展發生在呼叫proc之前。有人可以解釋為什么會這樣嗎?它發生在命令列處理器或讀取或檔案流中嗎?
我可以做這個:
cat data.csv | tr '*' '_' | while read -r line ; do proc "$line"; done | less
但我想知道是否有辦法阻止這種擴張。
或者,有沒有一種方法可以使用重定向形式而不是管道來過濾輸入,以及其他哪些特殊字符,例如:[,],?,-我需要替換嗎?
干杯,位元幣
PS:一個示例資料檔案:
gfh fg hfgh fgh fg hgh
7 4 674 547767 56 7 56756
ghdghh gh fg h fgh fg hf gh
8 678 678 * 67 867 8 678
gfh fg hfgh fgh fg hgh
7 4 674 547767 56 7 56756
ghdghh gh fg h fgh fg hf gh
8 678 678 67 867 8 678
和示例輸出:
gfh fg hfgh fgh fg hgh
7 4 674 547767 56 7 56756
ghdghh gh fg h fgh fg hf gh
8 678 678 data.csv file1.txt file2.txt file3.txt 67 867 8 678
gfh fg hfgh fgh fg hgh
7 4 674 547767 56 7 56756
ghdghh gh fg h fgh fg hf gh
8 678 678 67 867 8 678
更新:
星號只有在兩邊都有空格時才會被視為通配符,因此必須在某個時候進行標記化。
更新2:
如果直接呼叫 echo,則不會發生擴展。
while read -r line ; do echo "$line"; done <data.csv
uj5u.com熱心網友回復:
原因:路徑名擴展發生在變數擴展之后。在 中搜索“擴展順序” man bash。
擴展不會在呼叫proc之前發生,它發生在proc內部。
解決方法:加雙引號:
echo "$1"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/536797.html
標籤:狂欢通配符标准输入
上一篇:WPF自定義控制元件之訊息提示
