#!/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 25 --iterations 1250 --enhancement $2
done
如果$2
未指定,我不想将--enhancement $2
参数传递给我的 python 脚本。我该怎么做?
修改您的原始脚本:
如果变量已设置且不为空,则标准参数扩展
${var:+word}
将扩展为。在上面的代码中,我们使用它来添加命令是否可用且不为空。word
var
--enhancement "$2"
$2
我还冒昧地假设您
--snr
作为选项参数提供的应该是循环变量的值。我个人对代码的看法(主要是使用
printf
而不是echo
,避免长行,并给代码更多的空气):正如 mosvy 在下面的评论中指出的那样:如果你
/bin/sh
碰巧是dash
shell,或者其他一些在新 shell 会话开始时没有正确重置IFS
的 shell(这是 POSIX 要求的),并且如果你有,出于某种原因,导出IFS
并给它一个非默认值,那么您可能希望unset IFS
在上述脚本的顶部使用。只要您解决了导出可能引发的所有其他问题
IFS
(不要导出IFS
),请执行此操作。在不支持任何数组的最小 POSIX shell 上,您可以使用
set
命令操作位置参数列表。就在for
循环之前你可以做现在运行你的 for 循环
如果您的 shell 再次支持数组 bourne shell或其他
bash
,zsh
您可以只使用数组现在将脚本称为
正如评论中所指出的,您没有
snr
使用for 循环中 value 的实际值。使用$snr
脚本参数中适用的值,在这种情况下,您可能需要在循环内移动构造参数列表的逻辑。根据输入在变量中构建参数:
(还包括循环体中循环变量的修正)
您可以使用命令替换在一行中完成
使变量扩展消失的唯一方法是在扩展未引用时将扩展扩展为空值。
a
未引用时,变量 (和)的未设置值和空值b
都会消失(作为参数)。引用时两者都保留。此外,如果包含在 IFS 中,即使是空格(或任何字符)也会消失。
事实上,在值中包含要扩展的字符(未加引号)的 IFS 将分隔参数。
请注意这两个参数
<s>
,它们是在 IFS 包含 时<t>
扩展值而产生的。set
e
因此,我们需要未设置或空值的未引用扩展,当有要扩展的值时,它成为值的引用扩展:
描述:
然后我们可以使用
$1
value 将其消失或扩展如果有一些(非空)值,上面的行将打印两个单独的参数(不受 IFS 影响),或者如果为空或未设置,则什么都不打印。
$1
$1
脚本将变为:
此解决方案不受 IFS 值的影响