Bash 脚本有条件地检查是否有内容打印到终端

Bash 脚本有条件地检查是否有内容打印到终端

我编写了一个 bash 脚本来检查挂载 cifs 共享时是否输入了正确的密码并将其报告给用户。

它根本不起作用。我的意思是,现在我看它的整个部分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. 如果您希望变量包含空格(或对 shell 有特殊含义的其他字符,例如;&),那么您需要引用整个字符串。例如

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

    您编写的方式,不带引号,您正在设置share=sudo然后运行mount.cifs ...,这根本不是您想要的。

  2. 更重要的是,你的脚本的整个设计都是错误的。不需要定义 $share 变量然后执行它,即使你这样做,你也不会通过 grep 该变量获得挂载的结果(并且忽略了你的($share | $(grep) ...)行甚至不是有效的 shell的事实)句法)。

您的脚本应该更像这样,它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并搜索EXIT STATUS以查看可返回的退出状态代码的完整列表mount。但大多数时候,您只需要关心成功(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

相关内容