Shell-Script

如何有條件地從 POSIX shell 腳本傳遞參數?

  • January 26, 2020
#!/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碰巧是dashshell,或者在新的 shell 會話開始時沒有正確重置IFS的其他 shell(這是 POSIX 要求的),並且如果出於某種原因,您有,導出IFS並給它一個非預設值,那麼您可能希望unset IFS在上述腳本的頂部使用。

只要您解決了導出可能引發的**所有其他問題IFS(不要導出IFS),請執行此操作。

引用自:https://unix.stackexchange.com/questions/562870