쉘 스크립트에서 문자열 평가


8

이 bash 셸 스크립팅 안내서를 따르고 있습니다.

Numeric Comparisons 섹션에서 예제를 인용합니다 :

anny > num=`wc -l work.txt`

anny > echo $num
201

anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi

위에서 일어나는 것처럼 우리는 bash 변수에 일련의 명령을 저장하고 변수에 대해 echo를 호출합니다. 일어날 것으로 보이는 것은 문자열이 평가되고 wc 명령이 실행되고 행 수를 제어 터미널에 리턴하는 것입니다.

좋아, 우분투 12.04에서 터미널을 시작하고 비슷한 것을 시도하십시오.

$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt

문자열을 평가하지 않고 줄 수를 반환하는 잠깐만 기다리십시오. 그것은 단지 문자열을 터미널에 다시 에코했습니다. 왜 다른 결과를 얻었습니까?


num에는 문자열이 할당되지 않으며 wc -l work.txt대신 201이 할당됩니다.
ignis

답변:


2

식을 평가하려면 백틱을 사용해야합니다.

$ num=`wc -l sample.txt`
$ echo $num
1 sample.txt

출력에서 "1"만 보려면 명령을 사용하십시오.

$ num=`cat sample.txt | wc -l`
$ echo $num
1

또한 작동합니다.

$ num=`wc -l < sample.txt`
$ echo $num
1

자세한 내용 은 명령 줄에서 큰 따옴표 "", 작은 따옴표 ''및 백틱 ´ ´의 차이점을 참조하십시오 .


숫자 '1'뿐만 아니라 '1 sample.txt'를 얻는 이유는 무엇입니까?
JohnMerlino

이것이 wc명령이 작동 하는 방식입니다. 시도하십시오 cat sample.txt | wc -l.
Danatela

wc -l은 파일에 존재하는 줄 수를 파일 이름과 함께 표시합니다.
Avinash Raj

5

그 기호에 유의하십시오 :

'

작은 따옴표

   Enclosing characters in single quotes preserves the  literal  value  of
   each character within the quotes.  A single quote may not occur between
   single quotes, even when preceded by a backslash.

`

백 따옴표

   Command substitution allows the output of a command to replace the com
   mand name.  There are two forms:

          $(command)
   or
          `command`

   Bash performs the expansion by executing command and replacing the com
   mand  substitution  with  the  standard output of the command, with any
   trailing newlines deleted.

따라서 Backquote는 명령 결과를 표준 출력으로 반환합니다. 그 이유입니다

`wc -l sample.txt`

명령의 결과를 반환하는 동안

'wc -l sample.txt'

일반적인 문자열로 "wc -l sample.txt"를 반환하십시오.

이것을 예로 들어보십시오.

$ A='wc -l /proc/mounts'
$ B=`wc -l /proc/mounts`
$ C=$(wc -l /proc/mounts)

이제 세 변수를 모두 에코합니다.

$ echo $A
wc -l /proc/mounts
$ echo $B
35 /proc/mounts
$ echo $C
35 /proc/mounts

4

변수의 명령 출력을 캡처하려면 백틱을 사용 ``하거나 명령을 $()다음 과 같이 묶어야합니다 .

$ d=$(date)
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014
$ d=`date`
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014

실제로는 문자열을 에코 할 때가 아니라 변수 선언 순간에 문자열이 평가됩니다. 명령은 실제로 $()백틱 내에서 실행 되며 해당 명령의 출력은 변수 값으로 저장됩니다.

일반적으로 $()더 이상 사용되지 않으며 호환성 문제로 인해 훨씬 ​​제한적인 백틱 대신 항상 사용해야 합니다. 예를 들어 백틱 내에 중첩 명령을 사용할 수 없지만 다음과 $()같이 할 수 있습니다 .

$ echo $(date -d $(echo yesterday))
Sun Mar 16 10:26:07 CET 2014

피해야 하는 이유에 대한 자세한 내용은 U & L 에서이 스레드 를 참조하십시오 ``.


1
나는 스크립트를 선호한다 동의 $( )` `. 그러나 wag가 말했듯이 , 역 따옴표 중첩됩니다. echo $(date -d $(echo yesterday))된다 echo `date -d \`echo yesterday\``; echo $(echo $(date -d $(echo yesterday)))됩니다 echo `echo \`date -d \\\`echo yesterday\\\`\``. 나는 이것이 당신의 논문을 반박하지 않고 그것을 강화하기 위해 말합니다 : 탈출 된 내부 인용 부호는 ` `구문이 종종 인정되는 것보다 더 강력하지만 특별한 처리 \는 이상하고 놀랍고 추론하기가 어렵습니다. 으로 $( )당신이 볼 당신이 무엇을 얻을 일반적이다.
Eliah Kagan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.