2017-10-14 25 views
0

bash-newbie 여기에. 조건이있는 경우 - 그러나 입력하지 않습니다bash : grep-variable 문제로 문자열 비교하기

#!/bin/bash 

result=$(xinput --list-props 11 | grep "Device Enabled") 
echo $result 
# Output: Device Enabled (140): 1 

if [[ "$result" = "Device Enabled (140): 1" ]]; then 
     `xinput set-prop 11 "Device Enabled" 0` 
else 
     `xinput set-prop 11 "Device Enabled" 1` 
fi 

:

나는 활성화/내 노트북의 터치 패드를 비활성화 바로 가기로 다음과 같은 간단한 스크립트를 사용하고 싶습니다. echo $result은 변수가 실제로 비교할 문자열 값을 포함하고 있음을 보여줍니다. 잠시 동안 검색했지만 결과 변수와 문자열이 if 조건에서 일치하지 않는 이유를 전혀 알 수 없습니다.

+3

다음을보십시오 : http://www.shellcheck.net/ – Cyrus

+0

'echo $ result'를'echo "$ result"'로 대체하십시오. 변수에는 두 개의 탭이 있습니다. – Cyrus

+0

'xinput'을 역 인용 부호로 묶어서 조건 적으로 사용 하시겠습니까? 이러한 명령의 출력을 표시하려면 먼저'echo'와 같은 것을 사용해야합니다. 그리고 이미'$ (cmd)'형태의 cmd 치환을 사용하고 있기 때문에이 줄에 대해서도 그렇게하십시오. 나는 당신이'xinput ... '을 조건 적으로 사용하기 위해 cmd-substitution을 필요로하지 않는다고 생각한다. 'shellcheck.net' 플래그에 관심이 있는지 알아볼 것입니다. (예, 그렇습니다). 행운을 빕니다. – shellter

답변

1

grep에서 얻은 문자열에는 비교 문자열에 포함될 필요가있는 탭이 처음에 있습니다. echo "$result" (따옴표 포함)으로 다시 확인하는 것이 도움이되었습니다.

0

bash (그러나 기본 셸이 아님)에서는 [[ ]]의 패턴 일치 기능을 사용하여 문자열에 패턴이 들어 있는지 확인할 수 있습니다. 이런 식으로 사용하는 주요 탭 또는 해당 줄 골라 grep를 사용하는 경우에도 필요에 대해 걱정할 필요가 제거 : 시작과 패턴의 끝에서 *의 말 것을

if [[ "$(xinput --list-props 11 | grep "Device Enabled")" = *"Device Enabled (140): 1"* ]]; then 

참고 "선행 무엇에 의해 "그리고"뒤에는 무엇이든 "각각 있습니다.

또한 여기서는 큰 따옴표가 $(xinput ...) 인 것은 아니지만 큰 따옴표를 사용하지 않는 곳과 안전한 곳이 아닌 곳을 추적하는 IMO는 너무 많은 문제가 있습니다. (=의 왼쪽은 [[ ]] 안의 안전한 장소이지만 오른쪽은 그렇지 않다. [ ]에서는 거의 안전하지 않다. - 모든 것을 올바르게 기억하는 행운!) 나는 단지 항상을 선호한다. 큰 따옴표를 사용하십시오.