Bash 스크립트 함수는 True-False를 반환합니다.

Bash 스크립트 함수는 True-False를 반환합니다.

값을 반환하여 함수를 쿼리하고 싶습니다. 내 코드는 다음과 같습니다.

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    while read line; do
        if [ "$line" == "$funkx" ]
        then
            true
            break
        else
            false
        fi
    done < $file
}

printf "Please enter the value : "
read keyboard

if check $keyboard;
then
    echo "yes";
else
    echo "no";
fi

작동하지 않습니다. 내가 뭘 잘못하고 있는 걸까요?

답변1

truefalse각각 성공 및 실패 종료 코드로 종료되는 명령입니다 . 함수가 이러한 값을 반환하는 것을 허용하지 않습니다. 이를 수행하려면 명령 return과 성공(0) 또는 실패(0이 아닌 모든 값)에 해당하는 정수 값을 사용하세요. 또한 일치하지 않는 첫 번째 행에 대해서는 실패를 반환하고 싶지 않을 것이라고 확신합니다.아니요행 일치:

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    while read line; do
        if [ "$line" == "$funkx" ]
        then
            return 0    # 0 = success ("true"); break is not needed because return exits the function
        fi
    done < $file
    # If a line matched, it won't get here (it will have returned out of the middle
    # of the loop). Therefore, if it gets here, there must not have been a match.
    return 1    # 1 = failure ("false")
}

하지만 이를 수행하는 더 쉬운 방법이 있습니다. 사용 grep- 해당 작업은 파일에서 일치하는 줄을 검색하는 것입니다. grep -Fxq-- -F정규식 패턴이 아닌 고정 문자열 검색을 의미하고, 줄 -x의 일부가 아닌 전체 줄과 일치해야 함을 의미하며, -q일치하는 항목이 발견되면 성공 상태로 결과를 인쇄하지 않아도 됨을 의미합니다. 종료하고, 그렇지 않으면 실패합니다. return함수는 암시적으로 마지막 명령의 상태를 반환하므로 명시적인 명령도 필요하지 않습니다 .

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    grep -Fxq "$funkx" "$file"
}

아니면 더 간단합니다:

check(){
    grep -Fxq "$1" /root/Turkiye.txt
}

답변2

다른 파일에서 코드를 테스트하면하다약간 비효율적이라도 실제로는 작동합니다. /root/Turkiye.txt파일이 액세스할 수 있는 비어 있지 않은 파일이라고 가정하면 truefalse호출(함수에서 실행되는 마지막 명령이기 때문에)은 함수의 종료 상태를 0 또는 0이 아닌 것으로 설정합니다.

스크립트에 입력한 문자열이 읽고 있는 파일에서 별도의 줄로 발견되지 않았을 수도 있습니다. 안타깝게도 구문 분석 중인 파일의 모양, 스크립트에 입력하는 내용, 이 작업을 수행할 때 스크립트에서 얻고자 하는 응답이 무엇인지 명확하지 않습니다.

또한 while read line읽을 필요는 없다는 점에 유의하십시오.철사입력 파일에서. 예를 들어 ""IFS=read-r-line" 이해", 및 is는 [ ... ]두 문자열을 비교하는 연산자에 포함 =되지 않습니다 ==.

또한 단어 분리 및 파일 이름 생성(와일드카드)을 방지 $keyboard하려면 호출 시 큰따옴표를 사용해야 합니다 .check


사용자로부터 읽은 문자열이 특정 파일에서 한 줄로 나타나는지 확인하는 함수를 사용하려는 것 같습니다.

이 작업은 더 쉽게 수행할 수 있습니다.

grep -qxF -e "$keyboard" /root/Turkiye.txt

grep명령은 주어진 파일에서 문자열을 검색하고 종료 상태 0을 반환합니다(진짜) 동일한 행이 발견되면, 그렇지 않으면 0이 아닌 종료 상태가 반환됩니다(잘못된). 여기에 사용된 옵션은 아무것도 -q출력 grep하지 않고, -x전체 줄을 비교하고(하위 문자열 아님) -F문자열 비교를 수행하는 것입니다(정규식 일치 아님). 다음 인수가 검색 패턴이 되도록 지시합니다(그렇지 않으면 패턴의 첫 글자가 도입된 명령줄 옵션으로 처리됩니다) -e.grep-

스크립트가 수정되었습니다:

printf 'Please enter the value: ' >&2
IFS= read -r keyboard

if grep -qxF -e "$keyboard" /root/Turkiye.txt; then
    echo 'yes'
else
    echo 'no'
fi

사용자 입력 문자열에 대한 프롬프트를 표준 오류 스트림으로 출력하고 있다는 점에 유의하세요. 이는 관례에 따라 스크립트의 출력을 프롬프트 없이 리디렉션하고 사용할 수 있도록 하는 것입니다.

에서는 bash다음을 사용합니다.

IFS= read -r -p 'Please enter the value: ' keyboard

(를 bash사용하면 프롬프트 문자열도 표준 오류 스트림으로 출력됩니다 read -p.)

grep함수에서 사용 하려면 다음을 수행하십시오.

check () {
    grep -qxF -e "$1" /root/Turkiye.txt
}

그런 다음 사용

if check "$keyboard"; then
    echo 'yes'
else
    echo 'no'
fi

관련 정보