Bash: 선택적 인수가 있는 명령줄

Bash: 선택적 인수가 있는 명령줄

나는 이런 종류의 코드를 실행하고 있습니다.

#!/usr/bin/env bash
set -u
exclude1='--exclude=/path/*'
exclude2='--exclude=/path with spaces/*'
exclude3=''        # any 'exclude' can be empty
tar -czf backup.tgz "$exclude1" "$exclude2" "$exclude3" 2>&1 | grep -i 'my_reg_exp' > error.log
RESULT=("${PIPESTATUS[@]}")
... etc ...

이 코드를 실행하면 다음 오류가 발생합니다.

tar: : Cannot stat: No such file or directory

이는 "$exclude3"이 빈 매개변수로 번역되기 때문입니다. 내가 이렇게 하는 것처럼:

tar -czf backup.tgz "$exclude1" "$exclude2" ''

이 오류를 방지하는 한 가지 방법은 $excludeX 주위의 큰따옴표를 제거하는 것입니다. 그러나 $excludeX에 공백이나 기타 이상한 문자가 포함되어 있으면 문제가 발생할 수 있습니다.

또 다른 방법은 사용하는 eval것이지만 큰따옴표를 유지해야 하기 때문에 필요할 때 따옴표와 빈 매개변수를 억제하는 방법을 모르겠습니다.

내가 찾은 유일한 해결책은 문자열 연결을 사용하여 명령줄을 구성하는 것이었습니다.

CMD='tar -czf backup.tgz'
if [[ -n "$exclude1" ]]; then CMD+=" \"$exclude1\" "; fi
if [[ -n "$exclude2" ]]; then CMD+=" \"$exclude2\" "; fi
if [[ -n "$exclude3" ]]; then CMD+=" \"$exclude3\" "; fi
eval $CMD 2>&1 | grep -i 'my_reg_exp' > error.log
RESULT=("${PIPESTATUS[@]}")
... etc ...

더 똑똑한 아이디어를 가진 사람이 있나요?

답변1

tar -czf backup.tgz "$exclude1" "$exclude2" ${exclude3+"$exclude3"} 2>&1

${exclude3+"$exclude3"}$exclude3설정하지 않으면 빈 상태로 확장되고 , "$exclude3"설정하면 빈 상태로 확장됩니다.

(설정할 수 없는 다른 변수의 경우에도 마찬가지입니다.)

설정되지 않은 변수와 빈 문자열로 설정된 변수에는 차이가 있으므로 주의하세요.

unset exclude3

바꾸다

exclude3=''

답변2

bash에서 작업 중이므로 다음을 사용하십시오.대량으로.

excludes=()
excludes+=('--exclude=/path/*')
tar -czf backup.tgz "${excludes[@]}"

변수에 선택적 항목이 있는 경우 이를 조건에 추가합니다.

if [[ -n $exclude_or_empty ]]; then excludes+=("$exclude_or_empty"); fi

답변3

이것은 Ubuntu의 bash에서 작동하지만 POSIX 호환/호환인지는 알 수 없습니다.

tar -czf backup.tgz \
$(if "$exclude1" != ""); then echo "$exclude1"; fi
$(if "$exclude2" != ""); then echo "$exclude3"; fi
$(if "$exclude3" != ""); then echo "$exclude3"; fi

관련 정보