端末に何かが印刷されるかを条件付きで確認する 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)

条件文で2行目を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

ゼロ以外の終了コードの一部または全部を実際に処理する必要がある場合は、次のことを行う必要があります。

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

おすすめ記事