변수가 문자열로 구문 분석되지 않습니다


10

문제

bash 스크립트에서 다음과 같은 방식으로 wifi의 신호 레벨을 추출하려고 시도했습니다 (따옴표는 아무런 차이가없는 것 같습니다).

string="$(iwconfig wlan0 | grep -I Signal)"

I echo $string인 경우 기대하는 것을 얻습니다.

Link Quality=63/70 Signal level=-47dBm

그러나 하위 문자열을 얻으려고 echo ${string:5}하면 동일한 것을 반환합니다.


디버깅 :

wconfig wlan0 | grep -I Signal변수 의 출력을 변수 에 직접 붙여 넣으면 string="Link Quality=63/70 Signal level=-47dBm"모든 것이 예상대로 작동합니다.

echo $string 
# Link Quality=63/70 Signal level=-47dBm
echo ${string:5}
# Quality=63/70 Signal level=-47dBm

질문 : 인터넷에 따르면 모든 bash 변수는 문자열로 저장됩니다. 따라서 디버깅 결과는 원래 문제와 동일해야합니다. 원래 문제에서 텍스트로 구문 분석되지 않은 이유가 있습니까?

답변:


15

echo $string단순히 값을 인쇄하지 않기 때문 입니다 string. 먼저 split + glob 연산을 수행합니다 . 그 결과 중 하나는 선행 공백이 제거됩니다.

$ string=$(iwconfig wls1 | grep Signal)
$ echo $string
Link Quality=38/70 Signal level=-72 dBm

이므로

$ echo "$string"
          Link Quality=38/70  Signal level=-72 dBm  

시작 부분에 일련의 공백 문자가 있음을 알 수 있습니다 $string. 실제로 5 개 이상이 있습니다. 따라서 5를 제거하면 여전히 공백이있는 문자열이 ${string:5}남습니다.

$ echo "${string:5}"
     Link Quality=38/70  Signal level=-72 dBm  
$ echo ${string:5}
Link Quality=38/70 Signal level=-72 dBm

추가 토론은 다음을 참조하십시오.


4
tl; dr은 항상 변수를 인용합니다
gronostaj

6

이것은 내 컴퓨터에서 작동합니다.

$ string="$(iwconfig wlp60s0 | grep -I Signal)"
$ echo $string
Link Quality=68/70 Signal level=-42 dBm
$ echo $string | cut -d' ' -f4,5
level=-42 dBm
  • 컴퓨터의 경우 교체 wlp60s0와 함께 wlan0.
  • 참고 이 사이에 공간이 우분투 16.04 우분투 19.04 사용 42dBm. 따라서이 cut명령은 필드 # 4 및 # 5를 인쇄하도록 지시됩니다. 귀하의 질문에 공간이 없으므로 사용중인 버전이 확실하지 않습니다.

다음을 사용할 수도 있습니다.

$ echo $string | cut -d'=' -f3
-42 dBm
  • 이 경우 필드 구분 기호 cut로 사용하도록 지시됩니다 =.

${string...}올바른 구문이지만 사용하려면 다음을 수행하십시오.

$ echo ${string##*=}
-38 dBm

$ echo "${string##*=}"
-38 dBm  

두 방법 모두 마지막 문자열 이후에 부분 문자열을 가져옵니다 =. 5귀하의 질문에 대한 원래의 방법은 그것이 어떻게 작동하는지 이해하지 못합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.