빈 문자열이 명령줄을 깨뜨림

빈 문자열이 명령줄을 깨뜨림

내 문제를 설명할 수 없습니다. 양해해 주시기 바랍니다. 명령을 호출하는 스크립트가 있습니다. 입력 파일 선택에 따라 명령줄에 추가 매개변수를 포함해야 합니다. 나는 이것을 시도했습니다 :

    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에서 이와 같은 작업을 수행하는 올바른 방법은 무엇입니까? 내가 한 일은 다음과 같습니다.

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와 같은 셸에서는 다음 중 하나를 사용하여 인수를 저장합니다.

예를 들어 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"

즉, $trim_op참조되지 않습니다.

비어 있으면 trim_op다음과 같이 실행되어야 합니다.cdo -O remapcon,"$target_grid" "$input_file" "$output_file"

답변4

$ cdo -O remapcon,"$target_grid" ${trim_op} "$input_file" "$output_file"예를 들어 최근 누군가가 따옴표 없는 bash 변수 확장이 바로 내가 원하는 것이라고 지적했습니다 . 아야!

관련 정보