Shell
如何在腳本中生成一串串聯的鍵/值對?
--build-arg
我需要在busybox shell 中使用一些鍵/值對(build.args 文件)來建構參數字元串:script.sh
#!/bin/sh one=$1 two=$2 shift while IFS= read -r line; do set "$@" --build-arg "$line" done < "build.args" echo "$@"
建構.args
ONE=first TWO=second
執行
sh script.sh foo bar
(是的,腳本需要兩個參數)應該讀取 build.args 的內容並添加鍵/值對作為--build-arg
參數並輸出這個生成的字元串。這是我所期待的:--build-arg ONE=first --build-arg TWO=second
但是用我的腳本我確實得到了
bar --build-arg ONE=first --build-arg TWO=second
as
bar
在腳本呼叫中作為第二個參數傳遞。
您正在進入
bar
那裡,因為那$1
是您shift
在循環之前的操作之後的內容。要關閉兩個位置參數,請使用
shift 2
.shift
但是,通過替換為 清除循環之前的位置參數列表可能更安全set --
。這樣,您就不必依賴使用者提供正確數量的參數。如果您嘗試移出比列表中更多的值,某些 shell 會發出診斷消息,並且如果使用者給您的值太少或太多,這些仍然會在"$@"
.此外,在設置位置參數時,無論是在這種情況下還是在一般情況下,您都需要使用
set --
代替 plainset
,以避免意外設置 shell 選項,或者在這種情況下,set
使用無效選項進行呼叫。set -- "$@" --build-arg "$line"