현재 문자열이 변수에 존재하는지 확인하고 있습니다.
check_string() {
if [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]];
then
return 0
else
return 1
fi
}
check_string
문제는 두 번째 조건 [[ ! "$FILES" =~ "xyz" ]]
이 평가되지 않는다는 것입니다.
그러나 이를 부정하지 않으면 두 번째 조건이 평가됩니다 [[ "$FILES" =~ "xyz" ]]
.
check_string() {
if [[ "$FILES" =~ "abcd" ]] || [[ "$FILES" =~ "xyz" ]];
then
return 0
else
return 1
fi
}
check_string
어떤 아이디어가 있나요?
답변1
첫 번째 조건이 항상 true이면 두 번째 조건은 평가되지 않습니다.
언급하지 않은 내용이지만 "abcd"와 전혀 유사하지 않은 $FILES
것 같으 $FILES
므로 부정은 항상 참입니다.
답변2
당신의 테스트
[[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]]
때문이다드모건의 법칙, 동등
! [[ "$FILES" =~ "abcd" && "$FILES" =~ "xyz" ]]
문자열이 $FILES
정규 표현식과 일치하지 않는 한 테스트는 항상 참입니다.
또한 함수가 명시적으로 1 또는 0을 반환할 필요는 없습니다. 충분할 것이다
check_string() {
[[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]]
}
함수의 종료 상태는 함수 내에서 실행된 마지막 명령의 종료 상태입니다.
목록 작업 중이라면파일 이름또는 경로 이름을 문자열로 저장하지 마세요. 이렇게 하면 스크립트가 공백이 포함된 파일 이름을 처리하지 못하게 됩니다. 대신, 적절한 배열을 사용하여 경로 이름을 저장하십시오.
답변3
나는 이것이 논리적인 오해라고 생각한다. 하고 싶은 말을 하면 좋을 것 같아요.
- 정의된 파일 중 하나에 목록이 없으면 1을 반환하시겠습니까?
- 정의된 파일 중 하나 또는 모두가 목록에서 누락된 경우 1을 반환합니까?
- 목록에 또는 정의된 파일이 있으면 0을 반환하시겠습니까?
- 정의된 모든 파일이 목록에 있으면 0을 반환하시겠습니까?
Atm 두 가지 조건이 모두 실행될 것이라고 말씀드릴 수 있습니다.
set -x
스크립트를 입력하면 bash는 평가된 내용을 인쇄합니다.
$ cat check_string.sh
#!/usr/bin/env bash
set -x
check_string() {
if [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]];
then
return 0
else
return 1
fi
이것은 내 수표입니다.
$ FILES="abcd lmo xyz" ./check_string.sh
+ check_string
+ [[ ! abcd lmo xyz =~ abcd ]]
+ [[ ! abcd lmo xyz =~ xyz ]]
+ return 1
$ FILES="abcd lmo" ./check_string.sh
+ check_string
+ [[ ! abcd lmo =~ abcd ]]
+ [[ ! abcd lmo =~ xyz ]]
+ return 0
$ FILES="lmo xyz" ./check_string.sh
+ check_string
+ [[ ! lmo xyz =~ abcd ]]
+ return 0
$ FILES="abcd" ./check_string.sh
+ check_string
+ [[ ! abcd =~ abcd ]]
+ [[ ! abcd =~ xyz ]]
+ return 0
$ FILES="lmo" ./check_string.sh
+ check_string
+ [[ ! lmo =~ abcd ]]
+ return 0
$ FILES="xyz" ./check_string.sh
+ check_string
+ [[ ! xyz =~ abcd ]]
+ return 0
}
check_string
또한 : 조건을 더 명확하게 작성할 수 있다고 생각합니다. 변화
if [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]];
도착하다
if [[ ! "$FILES" =~ "abcd" || ! "$FILES" =~ "xyz" ]];
답변4
대체 구현(bash에만 국한되지 않음)
check_string() {
case "$1" in
*abcd*|*xyz*) return 1 ;;
*) return 0
esac
}
check_string "$FILES"