내 Bash 스크립트에는 다음 줄이 있습니다.
mv -f $HOME_DIR/$dir $HOME_SAVE/BACKUP
문제는 디렉토리 $dir
가 비어 있을 때( $dir
디렉토리 없음) mv
명령이 디렉토리를 이동했다는 것입니다 $HOME_DIR
. $dir
디렉토리를 이동하고 싶습니다 .
이것을 어떻게 피할 수 있습니까?
나는 이것을 사용할 수 있습니다 :
ls $HOME_DIR | wc -l
# and verify if the number is -gt 1
그러나 이것은 우아한 해결책이 아닙니다.
답변1
다음을 사용해야 합니다.
mv -f -- "$HOME_DIR/${dir:?}" "$HOME_SAVE/BACKUP/"
$dir
값이 비어 있으면 확장이 실패하고 스크립트가 종료되며 stderr에 오류 메시지가 표시됩니다.
인쇄할 메시지를 지정할 수도 있습니다. 예를 들면 다음과 같습니다.
mv -f -- "$HOME_DIR/${dir:?\$dir is UNSET or NULL!}" "$HOME_SAVE/BACKUP/"
대안으로 - 그러나 궁극적으로 - 설정되지 않거나 비어 있거나 유사한 양식을 사용하여 설정되고 비어 있지 않은 경우에만 적용되는 기본값 및/또는 대체 값을 지정할 수 있습니다 $dir
. 위 및 아래의 모든 예는 여러 가지 표준 POSIX 지정 매개변수 확장 형식을 나타냅니다.:-
:+
아래 예에서 $dir
설정되고 비어 있지 않은 경우 첫 번째 부분은 소스 디렉터리로 평가됩니다. 그렇지 않으면 아무것도 평가되지 않으며, 두 번째 부분은 해당 값이 있는 경우 해당 값으로 평가되지만, 없으면 다음과 같이 평가됩니다. 귀하의 대상 디렉토리. mv
첫 번째 및 두 번째 인수의 이름이 동일한 경로 이름으로 지정되면 사양이 실패하므로 아무것도 이동되지 않습니다.
mv -f -- "${dir:+$HOME_DIR/}${dir:-$HOME_SAVE/BACKUP/}" "$HOME_SAVE/BACKUP/" 2>/dev/null
내 생각에 이것은 약간 과잉일 수 있다.
mv -f -- "$HOME_DIR/$dir" ${dir:+"$HOME_SAVE/BACKUP/"} 2>/dev/null
...동일해야 합니다. mv
아무것도 이동할 수 없습니다 .아무데도. POSIX 호환 셸에서 따옴표는 중괄호 내에서도 확장을 보호할 수 있습니다 . 이 경우 값 확장이 {}
아니기 때문 입니다.$dir
${dir:+word}
단어가치가 확장되었습니다. 설정되지 않거나 비어 있는 경우 ${dir}
중괄호 안에 배치하면 확장이 아무것도 평가되지 않으며 심지어 빈 문자열도 평가되지 않습니다. 아마도 중요하지 않을 것입니다. 빈 파일 이름은 거의 모든 곳에서 유효하지 않다고 확신합니다. 그러나 이것이 제가 일반적으로 사용하는 방식입니다. 그러나 이는 안전하지 않습니다 . 이 경우 인용되지 않은 확장 또는 인용된 확장을 ${dir:-"word"}
받게 됩니다 .${dir}
word
null 인 경우에만 대화형 옵션을 호출하도록 선택할 수도 있습니다 -i
. 예를 들면 다음과 같습니다.mv
$dir
mv "-i${dir:+f}" -- "$HOME_DIR/$dir" "$HOME_SAVE/BACKUP/" </dev/tty
...그래서 적어도 실수로 파일을 덮어쓰지 않도록 할 수 있습니다..../지원아무도 먼저 누르지 않았어와이 (무슨 상관이야)터미널에서.
답변2
POSIX적으로:
[ -n "$dir" ] && mv -f -- "$HOME_DIR/$dir" "$HOME_SAVE/BACKUP"
또는:
[ -d "${dir:+$HOME_DIR/$dir}" ] && ...
답변3
dir
변수가 비어 있는지 테스트합니다 ( [[ -z $dir ]]
).
[[ -z $dir ]] || mv -t "$HOME_SAVE/BACKUP" "$HOME_DIR/$dir"
답변4
다음을 사용할 수 있습니다.
mv -f -- "$HOME_DIR/./$dir" "$HOME_SAVE/BACKUP/"
비어 있으면 $dir
"장치 또는 리소스가 사용 중입니다." 오류가 발생합니다.
그러나 이것은 약간의 해킹입니다.