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_1
和ARGS_2
)?
請注意,我的/bin/sh
是dash
.
答案1
在第一種情況下,傳遞給的參數count_args
由 shell 解釋,shell 看到兩個單詞--options
,1 2
然後將它們傳遞給count_args
.
對於第二種情況,在雙引號內,除$
和之外的所有字元\
都被視為文字。 shell 解釋單引號為時已晚,shell 將$ARGS
變數的內容視為長字串--options '1 2'
,所有字元都視為文字,對 shell 沒有特殊意義。
使用${ARGS}
不帶雙引號的情況會導致欄位分割和檔案名稱擴充。使用預設值IFS
,您將獲得三個獨立的單字:--options
、'1
和2'
。
存檔的最佳方法是使用"$@"
:
#!/bin/sh
set -- --options '1 2'
./count_args "$@"