터미널에 무언가가 인쇄되는지 조건부로 확인하는 Bash 스크립트

터미널에 무언가가 인쇄되는지 조건부로 확인하는 Bash 스크립트

cifs 공유를 마운트할 때 올바른 비밀번호가 입력되었는지 확인하고 이를 사용자에게 보고하기 위해 bash 스크립트를 작성했습니다.

전혀 작동하지 않습니다. 내 말은, 그 모든 부분이 grep지금 나에게는 이해가 되지 않는다는 것입니다. 비밀번호를 입력한 후의 출력이 아닌 원래 명령을 grep합니다.

#!/bin/bash

share=sudo mount.cifs //192.168.0.10/windows-share Shared/ -o user=me

$share

if [[ ($share | $(grep) "mount error (13): Permission denied") ]]; then
   echo "Wrong password"
else
    echo "Successful mount"
fi

비밀번호가 틀렸을 때 출력되는 모습은 다음과 같습니다.

Password for [email protected]/windows-share:
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)

조건문으로 두 번째 줄을 grep하려고합니다. 이게 가능했다면...

답변1

스크립트에 몇 가지 문제가 있습니다.

  1. ;변수에 공백(또는 또는 와 같이 셸에 특별한 의미가 있는 기타 문자)을 포함하려면 &전체 문자열을 인용해야 합니다. 예를 들어

     share='sudo mount.cifs //192.168.0.10/windows-share Shared/ -o user=me'
    

    따옴표 없이 작성하는 방식은 을 설정 share=sudo하고 실행하는 것인데 mount.cifs ..., 이는 전혀 원하는 것이 아닙니다.

  2. 더 중요한 것은 스크립트의 전체 디자인이 잘못되었다는 것입니다. $share 변수를 정의한 다음 실행할 필요가 없으며 그렇게 했더라도 해당 변수를 검색하여 마운트 결과를 얻지 못할 것입니다(그리고 라인이 ($share | $(grep) ...)유효한 쉘 구문이 아니라는 사실도 무시합니다) ).

sudo mount스크립트는 명령의 종료 코드를 직접 테스트하는 다음과 비슷해야 합니다 .

if sudo mount.cifs //192.168.0.10/windows-share Shared/ -o user=me ; then
  echo Successful mount
else
  echo Mount failed
fi

그런데 반환될 수 있는 종료 상태 코드의 전체 목록을 보려면 을 참조 man mount하고 검색하세요 . 하지만 대부분의 경우 성공(0) 또는 실패(다른 모든 것)에만 관심이 필요합니다.EXIT STATUSmount

0이 아닌 종료 코드의 일부 또는 전부를 실제로 처리해야 하는 경우 다음을 수행해야 합니다.

sudo mount.cifs //192.168.0.10/windows-share Shared/ -o user=me
result=$?

case "$result" in
  0) echo Successful mount ;;
  1) echo incorrect invocation or permissions ;;
  2) echo 'system error (out of memory, cannot fork, no more loop devices)' ;;
  4) echo internal mount bug ;;
  8) echo user interrupt ;;
 16) echo problems writing or locking /etc/mtab ;;
 32) echo mount failure ;;
 64) echo some mount succeeded ;; 
esac

관련 정보