폴더가 있는지 확인하는 쉘 스크립트에 함수가 설정되어 있습니다. 그렇지 않은 경우 폴더를 생성하려고 시도하고 폴더를 생성할 수 없는 경우(예: 사용자에게 올바른 권한이 없는 경우) 1을 반환한 다음 이것을 확인합니다. "return"이지만 return이 1이기 때문에 "if"가 작동하지 않는 이유를 이해할 수 없습니다.
암호:
#!/bin/bash
# Main folders
INPUT="input"
OUTPUT="output"
# Functions
function checkFolderExist(){
if [ -d $1 ]
then
# 0 = true
# Change to 0, only for tests.
return 1
else
mkdir $1
result=$?
if [ result==0 ]
then
# 0 = true
return 0
else
# 1 = false
return 1
fi
fi
}
CHECKINPUT=$(checkFolderExist $INPUT)
echo $?
CHECKOUTPUT=$(checkFolderExist $OUTPUT)
echo $?
# If folders does not exist, exit the script
if [[ "$CHECKINPUT" = 1 || "$CHECKOUTPUT" = 1 ]]; then
echo "[+] Error. Folder does not exist. Check user permissions."
exit 1
fi
답변1
다음은 몇 가지 사항입니다.
- 너희귀한
$?
동일한 종료 상태를 여러 번 참조해야 하는 경우를 제외하고 모든 항목을 명시적으로 확인하거나 변수에 저장 해야 합니다 . - 함수의 종료 상태는 함수에서 실행된 마지막 명령의 상태이므로
return
명시적인 종료가 거의 필요하지 않습니다(명시적인 반환이 있는 경우는 거의 없음).값적어도). - 디렉터리가 존재하는지 확인하는 함수는 디렉터리를 생성해서는 안 됩니다. 더 나은 전화
create_dir_if_needed
. - 에 오류가 있습니다
[ result==0 ]
. 문자열은result==0
길이가 0이 아닌 문자열입니다. 이 방법으로 문자열을 테스트하면 반환됩니다.진짜문자열 길이가 0이 아닌 경우 테스트는 항상 참입니다. 당신이 원하는 것은 아마도 것[ "$result" -eq 0 ]
입니다. - 어떤 상황인지 알지 못하는 한 변수 확장 및 명령 대체에는 항상 큰따옴표를 사용해야 합니다.이는 필수 사항이 아닙니다..
다음 사항을 고려하십시오.
create_dir_if_needed () {
mkdir -p -- "$1"
}
그러면 종료 상태가 반환됩니다 mkdir -p -- "$1"
. 이 명령은 지정된 디렉터리(및 중간 디렉터리)가 아직 없는 경우 생성합니다. mkdir
명령이 디렉터리 생성에 실패 하면 0이 아닌 종료 상태로 종료되며, 이는 함수의 종료 상태가 됩니다. mkdir -p
디렉터리가 이미 존재하는 경우에는 실패하지 않습니다.
다음과 같이 사용할 수 있습니다.
if ! create_dir_if_needed "$dirpath"; then
printf 'Failed to create directory "%s"\n' "$dirpath" >&2
exit 1
fi
혹은 기능이 간단하기 때문에 없애고 말씀하셔도 됩니다.
if ! mkdir -p -- "$dirpath"; then
printf 'Failed to create directory "%s"\n' "$dirpath" >&2
exit 1
fi
이 함수의 변형은 주어진 디렉터리 경로에 대해 누락된 상위 디렉터리가 생성되지 않도록 하기 위해 없이를 create_dir_if_needed
사용합니다 .mkdir
-p
create_dir_if_needed () {
if [ -d "$1" ]; then
return
fi
mkdir -- "$1"
}
또는,
create_dir_if_needed () {
[ -d "$1" ] || mkdir -- "$1"
}
이 함수를 호출하면 반환됩니다.진짜(영) 디렉터리가 이미 존재하거나 호출이 mkdir
성공한 경우입니다. 명시적인 값이 없는 문은 return
가장 최근에 실행된 문의 종료 상태를 반환하며, 이 경우 긍정적인 테스트 결과를 반환합니다 [ -d "$1" ]
.
답변2
Bash는 반환 값에 있어서 일반 프로그래밍 언어와 다릅니다.
여기서 헷갈리시죠산출checkFolderExist에서반품 상태checkFolderExist에서.
함수 echo
에 아무것도 없기 때문에 CHECKINPUT 및 CHECKOUTPUT 변수는 비어 있습니다 printf
.
정말로 기능을 저장하고 싶다면반품 상태나중에 사용하려면 다음을 수행해야 합니다.
checkFolderExist "${INPUT}"
CHECKINPUT=$?
checkFolderExist "${OUTPUT}"
CHECKOUTPUT=$?
그 외에도 어쨌든 다음 조언을 따르는 것이 좋습니다.코살로난다의 답변문제를 해결하기 위한 더 나은 기술을 안내합니다.
답변3
함수의 출력과 반환 값을 혼동하고 있습니다. 오류를 확인할 수 있도록 최소한의 실제 예제를 보여드리겠습니다.
반환:
myfunc() {
return 1
}
myfunc
ret=$?
[ $ret -eq 0 ] && echo OK
또는 표준 출력에 쓰고 출력을 확인합니다.
myfunc() {
echo '1'
}
ret="$(myfunc)"
[ "$ret" = '0' ] && echo OK
또한 나는 변수에 대해 정수와 문자열을 구별하는 것을 선호하는데 ret
, 출력이 숫자일 뿐이라는 것을 알고 있다면 더 명확하게 하기 위해 실제로는 필요하지 않습니다. 또한 조건문이 뒤에 오는 경우 반환 값을 변수에 캡처할 필요가 없습니다.
이것이 원하는 첫 번째 항목이므로 사용할 수 없습니다 $()
. 두 항목을 함께 혼합하면 첫 번째 예와 같이 값을 반환하고 두 번째 예와 같이 출력을 확인합니다.