셸: if에서 매개변수와 함께 함수 사용

셸: if에서 매개변수와 함께 함수 사용

아래 코드를 실행하려고 하는데 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

또한 정수를 먼저 확인하여 $docheck1이 아닌 경우 함수 호출을 피할 수 있습니다.

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

나는 이것이 더 간단하다고 생각하지만 많은 사람들이 좋아하는 && 논리가 부족합니다.

관련 정보