bash while 루프는 작은따옴표로 자극됨

bash while 루프는 작은따옴표로 자극됨

몇 줄의 코드가 있습니다. $1루프가 있는 파일에 매개변수가 있는지 확인하고 싶어서 while이 코드를 작성했습니다.

#!/bin/bash
if [ ! -z $1 ]
then
    update=$1;
    while read line
    do
        if [ $update == $line ]
        then
            echo "yes";
        fi
    done<./available_updates
fi

하지만 디버깅할 때 실행하면

[root@pc bagheri]# bash -x ./test.sh my_value

그것은 말한다:

+ '[' my_value == 'my_value' ']'

"is"라는 단어를 인쇄하는 대신 두 개의 작은따옴표 때문에 조건을 건너뛰지만 파일이 파일 my_value에 존재한다고 100% 확신합니다 . available_updates이 문제에 대해 어떻게 해야 합니까?

답변1

텍스트를 처리하기 위해 쉘 루프를 사용하지 마십시오

#! /bin/sh -
update="${1?missing update argument}"
grep -Fxqe "$update" < available_updates && echo yes

코드 관련 몇 가지 문제:

  • 매개변수 확장은 Bourne과 같은 쉘에서 인용되어야 합니다.
  • 한 줄을 읽는 구문은 readis IFS= read -r line, not 입니다 read line.
  • 구문인 경우 스크립트에 하나 이상의 매개변수가 제공되는지 확인합니다 [ "$#" -gt 0 ](해당 방법도 참조 ${1?error message}). [ ! -z "$1" ](여기에 누락된 따옴표를 추가하세요.) 첫 번째 따옴표가 비어 있지 않은지 확인하세요.

출력에 표시 되는 내용은 명령에 전달된 데이터의 일부가 아니며 ', 표시된 내용이 유효한 쉘 코드를 구성하는지 확인하기 위해 출력됩니다. 이는 단지 거기에 있는 것이 아니라 인용이 필요한 것으로 간주되는 다른 보이지 않는 문자가 있을 수 있음 을 나타냅니다 . "바이트 순서 표시" 문자인 U+FEFF와 같은 것일 수 있습니다.xtrace[$linemy_valuebash

달리기는 LC_ALL=C sed -n l < available-updates보이지 않는 수치를 드러내는 데 도움이 될 수 있습니다.

관련 정보