Shell-Script
如何有條件地從 POSIX shell 腳本傳遞參數?
#!/bin/sh echo "Noise $1" echo "Enhancement $2" for snr in 0 5 10 15 20 25 do python evaluate.py --noise $1 --snr 25 --iterations 1250 --enhancement $2 done
如果
$2
未指定,我不想將--enhancement $2
參數傳遞給我的 python 腳本。我該怎麼做?
修改您的原始腳本:
#!/bin/sh echo "Noise $1" echo "Enhancement $2" for snr in 0 5 10 15 20 25 do python evaluate.py --noise "$1" --snr "$snr" --iterations 1250 ${2:+--enhancement "$2"} done
如果變數已設置且不為空,則標準參數擴展
${var:+word}
將擴展為。在上面的程式碼中,我們使用它來添加命令是否可用且不為空。word``var``--enhancement "$2"``$2
我還冒昧地假設您
--snr
作為選項參數提供的應該是循環變數的值。我個人對程式碼的看法(主要是使用
printf
而不是echo
,避免長行,並給程式碼更多的空氣):#!/bin/sh printf 'Noise %s\n' "$1" printf 'Enhancement %s\n' "$2" for snr in 0 5 10 15 20 25; do python evaluate.py \ --noise "$1" \ --snr "$snr" \ --iterations 1250 \ ${2:+--enhancement "$2"} done
正如 mosvy 在下面的評論中指出的那樣:如果您
/bin/sh
碰巧是dash
shell,或者在新的 shell 會話開始時沒有正確重置IFS
的其他 shell(這是 POSIX 要求的),並且如果出於某種原因,您有,導出IFS
並給它一個非預設值,那麼您可能希望unset IFS
在上述腳本的頂部使用。只要您解決了導出可能引發的**所有其他問題
IFS
(不要導出IFS
),請執行此操作。