변수가 비어 있는지 확인

변수가 비어 있는지 확인

내 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"장치 또는 리소스가 사용 중입니다." 오류가 발생합니다.

그러나 이것은 약간의 해킹입니다.

관련 정보