값을 반환하여 함수를 쿼리하고 싶습니다. 내 코드는 다음과 같습니다.
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
true
false
각각 성공 및 실패 종료 코드로 종료되는 명령입니다 . 함수가 이러한 값을 반환하는 것을 허용하지 않습니다. 이를 수행하려면 명령 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
파일이 액세스할 수 있는 비어 있지 않은 파일이라고 가정하면 true
및 false
호출(함수에서 실행되는 마지막 명령이기 때문에)은 함수의 종료 상태를 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