為什麼 POSIX shell 腳本中的這些嵌套選項會被分詞?

為什麼 POSIX shell 腳本中的這些嵌套選項會被分詞?

count_args我有一個計算參數的腳本:

#!/bin/sh
echo $#

如果我使用這些選項來呼叫它,它會告訴我它有兩個參數:

$ ./count_args --options '1 2'
2

但是如果我在腳本中建構參數,test_args如下所示:

#!/bin/sh
ARGS="--options '1 2'"
./count_args ${ARGS}

……我得到結果:

$ ./test_args 
3

'1 2'劇本為何要分裂?我怎麼能以符合 POSIX 標準的方式避免這種情況,從呼叫腳本?是否仍然可以以某種方式將參數儲存在變數中,以便我可以在更複雜的腳本中將它們分開(例如具有ARGS_1ARGS_2)?

請注意,我的/bin/shdash.

答案1

在第一種情況下,傳遞給的參數count_args由 shell 解釋,shell 看到兩個單詞--options1 2然後將它們傳遞給count_args.

對於第二種情況,在雙引號內,除$和之外的所有字元\都被視為文字。 shell 解釋單引號為時已晚,shell 將$ARGS變數的內容視為長字串--options '1 2',所有字元都視為文字,對 shell 沒有特殊意義。

使用${ARGS}不帶雙引號的情況會導致欄位分割和檔案名稱擴充。使用預設值IFS,您將獲得三個獨立的單字:--options'12'

存檔的最佳方法是使用"$@"

#!/bin/sh

set -- --options '1 2'

./count_args "$@"

相關內容