쉘 스크립트에서 문자열 작업 처리(및 grep 결과 테스트)

쉘 스크립트에서 문자열 작업 처리(및 grep 결과 테스트)

터치패드를 전환하기 위해 이 스크립트를 작성했지만(키바인딩하겠습니다) 작동하지 않습니다. 이 코드는 왜 작동하지 않나요? 그렇다면 어떻게 하면 이 기능을 더 우아하게 수행할 수 있을까요?

#!/bin/sh

if [ "synclient | grep TouchpadOff | grep -o -E '[0-9]+'" ]
then
        synclient TouchpadOff=0
        notify-send "Touchpad Enabled"
else
        synclient TouchpadOff=1
        notify-send "Touchpad Disabled"
fi

답변1

당신이 글을 쓸 때

 if [ "some string or other" ]
 then

연산자는 [실행되지 않고 some string or other단지 비어 있지 않은 문자열을 보고 그것이 값이라고 말합니다 true.

당신이 원하는

 if [ "`synclient | grep TouchpadOff | grep -o -E '[0-9]+'`" ] 

아니면 좀 더 현대적인 것

if [ "$(synclient | grep TouchpadOff | grep -o -E '[0-9]+')" ]

그러나 grep이 종료 코드를 생성하므로 실제로 명령이 문자열을 생성했는지 확인할 필요가 없습니다.

if synclient | grep TouchpadOff | grep -q -E '[0-9]+'
then

당신이 원하는 것을해야합니다. synclient의 출력 형식은 모르지만 문제 없이 두 개의 grep을 하나로 병합할 수 있기를 바랍니다.

답변2

이카루스가 준좋은 대답. 귀하의 질문에 스크립트가 수행해야 하는 작업을 정확히 설명하지 않았기 때문에 답변하기가 어렵습니다. 따라서 우리는 스크립트를 리버스 엔지니어링해야 합니다(그리고 귀하가 생각한 것을 추측해야 합니다).

icarus는 사용자가 보고 있는 출력에 synclient"TouchpadOff"와 숫자가 포함된 줄이 포함되어 있는지 추측합니다.

귀하의 가정/예상 출력에는 synclient"TouchpadOff"와 숫자가 포함된 줄이 포함되어 있고 해당 숫자가 0인지 확인하고 싶습니다.

Icarus의 추측이 맞다면 읽기를 중단하세요.

내 추측이 맞다면 끝에서 두 번째(마지막에서 두 번째) 명령을 조정할 수 있습니다. 이카루스의 대답다음과 같이:

if [ "$(synclient | grep TouchpadOff | grep -o -E '[0-9]+')"! = 0]

(숫자가 0인지 테스트합니다) 이는 상당히 이식성이 있어야 합니다. 하지만 더 짧은 방법도 있을 수 있습니다.

  • Bash를 사용하면 이렇게 할 수 있습니다

    만약에(("$(synclient | grep TouchpadOff | grep -o -E '[0-9]+')"))

    구문을 사용하십시오. 이를 수행하는 데 따른 문제점은 다음과 같습니다.((expression))

    • POSIX와 호환되지 않으므로 bash 이외의 셸에서의 동작은 사례별로 고려해야 합니다.
    • 명령의 출력이 비어 있으면 0으로 처리됩니다.

       

  • synclient표시된 것보다 출력에 대해 더 많이 알고 있는 경우 더 스마트하게 작성할 수 있습니다. 예를 들어 출력에 다음과 같은 문자열이 포함된 줄이 포함될 것이라고 grep확신하는 경우synclientTouchpadOff = numbernumber앞에 0이 없는 음수가 아닌 정수(즉 0,  1, , 또는  일 수 있지만 , ,  또는  42는 아닐 수 있음 ) 앞뒤에 공백이 있을 수도 있고 없을 수도 있습니다. 그러면 다음을 수행할 수 있습니다.010.5off=

    만약에!동기화 클라이언트 | grep -q '터치패드 끄기 [[:space:]]*=[[:space:]]*0'

    일부 버전 grep(예: GNU grep)에서는 다음과 같이 단축할 수 있습니다.

    만약에!동기화 클라이언트 | grep -q '터치패드 끄기\s*=\s*0'

    !명령의 진리값을 반전시키기 위해  추가했습니다 . grep -q 'TouchpadOff…=…0'발견되면 (분명히) 작동할 것입니다 TouchpadOff = 0. 하지만 제 추측이 맞다면 다음을 수행하고 싶을 것입니다.

    synclient TouchpadOff=0
    

    현재 값이 다음과 같은 경우 명령아니요영.

관련 정보