아래 코드를 실행하려고 하는데 if 문에서 함수를 사용하려고 하면 오류가 발생합니다 -bash: [: too many arguments
. 왜 이런 일이 발생합니까?
미리 감사드립니다!
notContainsElement () {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 1; done
return 0
}
list=( "pears" "apples" "bananas" "oranges" )
blacklist=( "oranges" "apples" )
docheck=1
for fruit in "${list[@]}"
do
if [ notContainsElement "$fruit" "${blacklist[@]}" -a $docheck = 1 ]
then
echo $fruit
fi
done
답변1
사용하면 if [ ... ]
실제로 [
유틸리티를 사용하는 것입니다( test
마지막 인수와 동일하지만 필요함 ]
).
[
함수를 실행하려면 문자열이 필요하다는 것을 이해하지 못합니다. 다행히도 [
여기서는 전혀 사용할 필요가 없습니다 (적어도 이 기능의 경우).
if [ "$docheck" -eq 1 ] && notContainsElement "$fruit" "${blacklist[@]}"; then
...
fi
또한 정수를 먼저 확인하여 $docheck
1이 아닌 경우 함수 호출을 피할 수 있습니다.
if
이는 임의의 명령을 받아들이고 명령의 종료 상태에 따라 수행할 작업을 결정하기 때문에 작동합니다 . 여기서는 [ ... ]
테스트와 함수 호출을 사용 하고 &&
중간에 복합 명령을 만듭니다. [ ... ]
테스트와 함수 모두 종료 상태로 0을 반환 하면 복합 명령의 종료 상태는 true가 되어 성공을 나타냅니다.
스타일 참고로, 배열이아니요요소를 포함하지만 다음과 같은 경우하다요소를 포함하고
if [ "$docheck" -eq 1 ] && ! contains "$fruit" "${blacklist[@]}"; then ...
기능 테스트 결과가 부정적이면 논리가 엉망이 됩니다.하다배열에 요소( if ! notContainsElement ...
)가 포함되어 있는지 테스트하고 싶습니다.
답변2
노력하다
if notContainsElement "$fruit" "${blacklist[@]}" && test "$docheck" = 1
then
-a
옵션은 쉘도 아니고test
옵션 도 아닙니다
테스트의 두 부분은 다음과 같습니다.
notContainsElement "$fruit" "${blacklist[@]}"
test $docheck = 1 ## or [ $docheck = 1 ]
if
그런 다음 다음을 사용하여 연결합니다 .
if cmd1 && cmd2
지적한 대로 -a
이는 테스트 옵션이지만 다른 테스트 옵션에서만 작동하므로 다음을 사용할 수 있습니다.
if [ "$a" -lt "$b" -a "$a" -lt "$c" ]
$a
및 아래의 값을 테스트 $b
하지만 $c
테스트 범위 내에서는 다른 명령을 사용할 수 없습니다.
답변3
이것은 일부 사람들이 좋아하지 않을 수도 있는 대안입니다. 블랙리스트 배열을 문자열로 변환하고 과일이 제거된 문자열이 동일한지 확인하세요. 문자열을 공백으로 채우도록 편집되었습니다. 사과/파인애플 문제를 지적해 주신 Scott에게 감사드립니다.
badlist=" ${blacklist[@]} "
for f in "${list[@]}"
do
if [[ "${badlist/" $f "/}" == "$badlist" ]]
then
echo "$f"
fi
done
나는 이것이 더 간단하다고 생각하지만 많은 사람들이 좋아하는 && 논리가 부족합니다.