몇 줄의 코드가 있습니다. $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과 같은 쉘에서 인용되어야 합니다.
- 한 줄을 읽는 구문은
read
isIFS= read -r line
, not 입니다read line
. - 구문인 경우 스크립트에 하나 이상의 매개변수가 제공되는지 확인합니다
[ "$#" -gt 0 ]
(해당 방법도 참조${1?error message}
).[ ! -z "$1" ]
(여기에 누락된 따옴표를 추가하세요.) 첫 번째 따옴표가 비어 있지 않은지 확인하세요.
출력에 표시 되는 내용은 명령에 전달된 데이터의 일부가 아니며 '
, 표시된 내용이 유효한 쉘 코드를 구성하는지 확인하기 위해 출력됩니다. 이는 단지 거기에 있는 것이 아니라 인용이 필요한 것으로 간주되는 다른 보이지 않는 문자가 있을 수 있음 을 나타냅니다 . "바이트 순서 표시" 문자인 U+FEFF와 같은 것일 수 있습니다.xtrace
[
$line
my_value
bash
달리기는 LC_ALL=C sed -n l < available-updates
보이지 않는 수치를 드러내는 데 도움이 될 수 있습니다.