IF 및 OR 다중 조건이 FOR 루프에 들어갑니다.

IF 및 OR 다중 조건이 FOR 루프에 들어갑니다.

if 구문의 조건에 이상한 문제가 있습니다. 아래 코드는 "performance_schema" 및 "innodb" 문자열을 인쇄해서는 안 됩니다.

/usr/bin/mysql -u $DB_USER -p$DB_PASS -h $DB_HOST -e "SHOW DATABASES" -E | grep -v "*" | gawk '{print $2}' > $DB_NAMES

for DBNAME in `cat $DB_NAMES`; do
  if [[ "$DBNAME"!='performance_schema' ]] || [[ "$DBNAME"!='innodb' ]]; then
    echo "---> $DBNAME selected"
  fi
done

rm -f $DB_NAMES

그러나 출력은 다음과 같습니다.

---> demodb selected
---> information_schema selected
---> innodb selected
---> mysql selected
---> performance_schema selected
---> tmp selected

답변1

진술 case을 통해 논리가 명확해질 것입니다.

while IFS= read -r dbname; do
    case "$dbname" in
        'performance_schema' | 'innodb') : ;; # do nothing
        *) echo "---> $dbname selected" ;;
    esac
done < "$db_names"

기타 참고사항:

  • 변수 이름을 모두 대문자로 사용하는 습관을 없애고 이러한 변수 이름을 쉘 예약 이름으로 유지하십시오. 언젠가 당신은 글을 쓰게 될 PATH=something거예요스크립트가 왜 손상되었는지 궁금합니다..
  • 파일의 행을 정확하게 읽으려면 while read루프를 사용하십시오.배쉬 FAQ #1.

관련 정보