我无法描述我的问题。请多多包涵。我有一个调用命令的脚本。我需要根据输入文件选择在命令行中包含额外的参数。我试过这个:
case "$model" in
CNRM-CM6-1|CNRM-ESM2-1)
trim_op="-selindexbox,2,361,2,293"
;;
EC-Earth3)
trim_op="-selindexbox,2,361,2,291"
;;
IPSL-CM6A-LR)
trim_op="-selindexbox,2,361,2,331"
;;
MPI-ESM1-2-HR)
trim_op="-selindexbox,2,801,3,403"
;;
MPI-ESM1-2-LR)
trim_op="-selindexbox,2,255,2,219"
;;
NorESM2-LM)
trim_op="-selindexbox,2,359,2,383"
;;
*)
trim_op=""
;;
esac
cdo -O remapcon,"$target_grid" "$trim_op" "$input_file" "$output_file"
但 bash 被这个空词噎住了。在 bash 中做这样的事情的正确方法是什么?我最终做的是:
if [[ -z $trim_op ]] ; then
cdo -O remapcon,"$target_grid" "$input_file" "$output_file"
else
cdo -O remapcon,"$target_grid" "$trim_op" "$input_file" "$output_file"
fi
我现在感觉自己很无知。这个有名字吗?我所做的每一次搜索都会出现获取顶部这不是我要找的。
答案1
如果你想在变量为空时"$trim_op"
从调用中删除参数,你可以这样做:cdo
cdo -O remapcon,"$target_grid" ${trim_op:+"$trim_op"} "$input_file" "$output_file"
变量展开${trim_op:+"$trim_op"}
扩展到 "$trim_op"
(然后进一步扩展)如果trim_op
设置了变量并且变量中的值不为空。
答案2
"$trim_op"
无论变量的值是什么,都会扩展为单个参数。因此,如果trim_op
设置为空字符串,您将得到一个空参数,这可能不适用于大多数程序。
"$@"
这与和扩展不同"${array[@]}"
,它可以产生可变数量的参数。因此,在支持数组的 Bash、ksh 或 zsh 等 shell 中,使用其中之一来保存参数。
例如使用 Bash
unset args
case "$model" in
CNRM-CM6-1|CNRM-ESM2-1)
args+=("-selindexbox,2,361,2,293") ;;
EC-Earth3)
args+=("-selindexbox,2,361,2,291") ;;
# *)
# nothing here ;;
esac
args+=("$input_file" "$output_file")
cdo -O remapcon,"$target_grid" "${args[@]}"
通常,人们也会以另一种方式遇到这种情况,试图从一个变量中获取两个参数,如果那里有空格或通配符,就会中断。
也可以看看
- 有条件地将参数传递给脚本
- 如果引用的变量为空,如何将其扩展为空?和
- 我们如何运行存储在变量中的命令?有关在变量中存储命令和命令参数的其他问题
答案3
由于通常没有空间trim_op
,您可以:
cdo -O remapcon,"$target_grid" $trim_op "$input_file" "$output_file"
ie$trim_op
未被引用。
如果trim_op
为空,则应运行为cdo -O remapcon,"$target_grid" "$input_file" "$output_file"
答案4
最近有人指出,例如,不带引号的 bash 变量扩展$ cdo -O remapcon,"$target_grid" ${trim_op} "$input_file" "$output_file"
正是我想要的。哎哟!