나는 이런 종류의 코드를 실행하고 있습니다.
#!/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