我正在尝试制作一个 shell 脚本,它会向用户询问一些问题,并根据用户的选择发出带有某些或其他选项的最终命令。现在,脚本如下所示:
if [[ $a == "y" ]] ; then
command --option 1 argument
elif [[ $a == "n" ]] ; then
command --option 2 argument
else
command --option 3 argument
fi
考虑到命令很长,并且包含很多选项和参数,这些选项和参数在不同语句之间保持不变,我想知道是否可以以某种方式编写一行,仅在相应条件为真时才考虑变量选项。
这也适用于GNU parallel
发出一个或多个命令
if [[ $b == "n" ]] ; then
find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument
else
find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument\; command2 --option argument
答案1
当然,您可以存储传递变量的选项。您的第一个示例可能是这样的(也是[[
bash 功能,在 POSIX shell 中不可用):
if [[ $a == "y" ]] ; then
arg=1
elif [[ $a == "n" ]] ; then
arg=2
else
arg=3
fi
command --option "$arg" argument
你的第二个例子:
if [[ $b != "n" ]] ; then
extra="; command2 --option argument"
fi
find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument$extra
# if unset, $extra will be empty—you can of course explicitly
# set it to '' if this bothers you.
这些之所以有效,是因为变量扩展的工作原理:它只是替换到命令行中,然后(如果未加引号)进行分词,然后传递给命令。因此被调用的命令根本不知道变量,shell 在调用它之前扩展了它们。
由于您使用的是 bash,因此还可以使用数组:
args=()
if [ -n "$OPT_LONG" ]; then
args+=(-l)
fi
if [ -n "$OPT_SORT_TIME" ]; then
args+=(-t)
fi
ls "${args[@]}"
数组功能使您可以轻松构建任意长的参数列表,而不必担心分词会破坏您的代码。