空字符串中断命令行

空字符串中断命令行

我无法描述我的问题。请多多包涵。我有一个调用命令的脚本。我需要根据输入文件选择在命令行中包含额外的参数。我试过这个:

    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"正是我想要的。哎哟!

相关内容