將選項從變數傳遞給任何 linux 程序
所需程式碼:
echo "$var" | sort -t/ -k 1,1n -k2,2n -k3,3n
案例場景:根據條件動態創建並儲存在變數中的對 arr 進行排序的選項。我怎樣才能通過它們。
option='-k 1,1n -k2,2n' echo "$var" | sort -t/ "$option"
或者
echo "$var" | sort -t/ "$(eval echo "$option")
但沒有任何工作。拋出雜散字元錯誤
sort: stray character in field spec: invalid field specification ‘ 1,1n -k 2,2n -k 3,3n’
請注意,該
sort
命令需要將選項作為單獨的參數字元串接收,即sort
-t/
-k
1,1n
-k2,2n
-k3,3n
.當您使用雙引號擴展時,例如
"$option"
,所有選項都將作為單個字元串傳遞,即sort
-t/
-k 1,1n -k2,2n -k3,3n
.為避免這種情況,請不要在周圍使用引號
$option
:option='-k 1,1n -k2,2n' echo "$var" | sort -t/ $option
-k
排序選項可以接受欄位規範作為同一參數字元串 ( ) 的一部分,也可以作為選項 ( )-k2,2n
之後的下一個參數字元串。如果欄位說明是與選項說明符相同的參數字元串的一部分,它甚至可以接受空格:-k``-k
1,1n
echo works | sort -t/ "-k 1,1n" -k2,2n -k3,3n works
但即使在欄位規範之後的同一參數字元串中的單個空白字元也是不可接受的:
echo fails | sort -t/ "-k 1,1n " -k2,2n -k3,3n sort: stray character in field spec: invalid field specification ‘ 1,1n ’
以下是適用於您的問題的一般答案,以及您可能希望在實際使用它們之前將命令行參數儲存在變數中的任何其他情況。
您的程式碼的問題是,當您
"$option"
在命令行上使用 時sort
,它是一個參數。在這種情況下,您可以通過簡單地刪除引號並讓 shell$option
在空格、製表符和換行符上拆分字元串來解決此問題,然後在sort
使用結果列表呼叫之前對這些生成的單詞執行文件名萬用字元。這樣做對您的情況有效,但解決問題的方式不太優雅。它會不太優雅,因為它依賴於在
$option
空格上正確拆分字元串並且不包含文件名通配模式。對於更通用的解決方案,將選項和選項參數放在一個數組中;這樣,您可以引用每個需要它的參數。以下程式碼假定您使用的是
bash
支持數組的 shell,例如 。options=( -k 1,1n -k 2,2n -k 3,3n ) sort -t '/' "${options[@]}" <<<"$var"
通過引用 的擴展
${options[@]}
,可以確保數組的每個元素options
都擴展為單個欄位,這意味著 shell 將擴展options
數組,就好像所有元素都在命令行上單獨引用為sort
.在沒有數組的 shell 中,請改用位置參數列表:
set -- -k 1,1n -k 2,2n -k 3,3n printf '%s\n' "$var" | sort -t '/' "$@"
就像第一個程式碼被剪斷一樣,引用
$@
是必不可少的,因為它保證位置參數列表的每個元素都被完整地擴展。在這裡,shell 也會擴展"$@"
為一個欄位列表,並將這些作為參數提供給sort
實用程序。在任何情況下,您都希望避免使用
echo
輸出值,$var
因為echo
我會根據 shell 的配置和變數的內容修改數據。也可以看看: