변수를 사용할 때 스크립트가 중단됩니다.

변수를 사용할 때 스크립트가 중단됩니다.

script01.sh아주 잘 작동

#!/bin/sh -x
egrep 'snmp.* version [123]|ip route ' $1

산출

[user@linux ~]$ script01.sh file.txt
+ egrep 'snmp.* version [123]|ip route ' file.txt

그런데 내용을 변경해서 변수에 넣으면 깨집니다.

script02.sh

#!/bin/sh -x
var='snmp.* version [123]|ip route '
egrep $var $1

출력 스크립트 02.sh

[user@linux ~]$ script02.sh file.txt
' x='snmp.* version [123]|ip route
+ egrep 'snmp.*' version '[123]|ip' route $'\r' file.txt
egrep: version: No such file or directory
egrep: [123]|ip: No such file or directory
egrep: route: No such file or directory
: No such file or directory

$var& 를 큰따옴표로 묶을 때 $1이런 일이 발생합니다 .

스크립트 03

#!/bin/sh -x
var='snmp.* version [123]|ip route '
egrep "$var" "$1"

출력 스크립트 03

[user@linux ~]$ script03.sh file.txt
' var='snmp.* version [123]|ip route
' file.txt

답변1

$var명령줄에서 따옴표를 사용하지 않기 때문에 스크립트가 중단됩니다 egrep. 이로 인해 쉘은 이를 공백, 탭 및 줄 바꿈(기본적으로)에서 별도의 단어로 분할하고 각 단어는 생성된 단어 snmp.*앞에도 파일 이름이 붙습니다. globbing(예를 들어 현재 디렉터리에서 일치하는 모든 파일 이름은 다음으로 확장됩니다) egrep.

egrep나만 인식 하니까첫 번째옵션이 아닌 인수는 패턴으로 사용되며, 나머지 인수는 파일명으로 간주됩니다.

대신에

#!/bin/sh -x
pattern='snmp.* version [123]|ip route '
grep -E -n --color=auto -e "$pattern" "$1"

grep -E및 와 동일합니다 egrep. 일치시키려는 패턴을 변수에 넣기 때문에 grep매개변수 중 하나가 패턴이라고 명시적으로 말하고 싶습니다 -e. 이 외에도 쉘이 변수 값에 대해 수행하는 앞서 언급한 토큰화 및 와일드카드 지정을 피하기 위해 모든 변수 확장을 큰따옴표로 묶었습니다(이 $1역시 이에 의해 영향을 받는다는 점에 유의하세요).

또한 스크립트에는 \r마치 DOS 텍스트 줄인 것처럼 (캐리지 리턴) 문자로 끝나는 일부 줄이 있는 것으로 보입니다. Windows 텍스트 편집기를 사용하여 스크립트를 작성하는 경우 이런 일이 발생할 수 있습니다. 스크립트를 Unix 텍스트 파일로 변환하려면 dos2unix스크립트 파일에서 사용하세요.

당신은 또한 볼 수 있습니다


약간만 수정하면 스크립트는 명령줄에 지정된 여러 파일을 처리할 수 있습니다.

#!/bin/sh -x

pattern='snmp.* version [123]|ip route '

for pathname do
    grep -E -n --color=auto -e "$pattern" "$pathname"
done

관련 정보