如何忽略 shell 脚本中的错误?

如何忽略 shell 脚本中的错误?

我正在编写一个脚本,但是当找不到某些东西时它会抛出一些错误,我需要忽略这些错误。我的意思是当我运行脚本时如果不应该显示任何错误它应该显示积极的结果。

#!/bin/sh
boot=$(ls /bootpool | grep boot | awk 'NR==1{print $1}')
data=$(ls /datapool | grep boot | awk 'NR==1{print $1}')
echo "boot"
if [ "$boot" == "boot" ] 
then
    echo "boot"
    pass=$(grep rootpw /bootpool/boot/loader.conf| grep -o '".*"' | sed 's/"//g' | awk 'BEGIN { ORS = " " } { print }')
elif [ "$data" == "boot" ]
then
    pass=$(grep rootpw /datapool/boot/loader.conf| grep -o '".*"' | sed 's/"//g' | awk 'BEGIN { ORS = " " } { print }')
fi
if [ $pass == edjos ]
then
   echo  "You are at default password. kindly change the password"
   oldpass=$(grep root /etc/master.passwd | awk 'NR==1 { print $1 }' | cut -d ':' -f 2 | sed 's/\$/\%/g')
   passwd
   newpass=$(grep root /etc/master.passwd | awk 'NR==1 { print $1 }' | cut -d ':' -f 2 | sed 's/\$/\%/g')
    if [ "$newpass" != "$oldpass" ]
     then              
          if [ "$boot" == "boot" ]
          then 
              sed -i.bak '/mfsbsd.rootpw/s/edjos//' /bootpool/boot/loader.conf
              sed -i.bak '/mfsbsd.rootpwhash/d' /bootpool/boot/loader.conf
              echo mfsbsd.rootpwhash=\"$newpass\"  >> /bootpool/boot/loader.conf
            echo "Great! password updated successfully"
          elif [ "$data" == "boot" ]
          then
             sed -i.bak '/mfsbsd.rootpw/s/edjos//' /datapool/boot/loader.conf
             sed -i.bak '/mfsbsd.rootpwhash/d' /datapool/boot/loader.conf
             echo mfsbsd.rootpwhash=\"$newpass\"  >> /datapool/boot/loader.conf
            echo "Great! password updated successfully"
         fi
    fi
    else
     echo "Great! you are having authorised password"
fi

答案1

您可以放置2>/dev/null​​一个命令来抑制错误:

ls /home/cas/thisfolderdoesntexist-> 错误

ls /home/cas/thisfolderdoesntexist 2>/dev/null-> 由于错误被抑制,因此没有输出。

您还可以2>/dev/null放置一个脚本来运行完整脚本并抑制错误:

./script.sh 2>/dev/null

您所做的就是将>错误 ( 2) 重定向到/dev/null。重定向到 /dev/null 的每条数据(在本例中是命令/脚本的输出)都将被完全忽略。将其视为数据垃圾箱。


编辑: 2>/dev/null抑制命令的输出,而不是完整的管道。在您给出的示例中,您正在抑制来自 awk 命令的错误。如果错误来自命令ls,请执行以下操作(这将抑制来自 ls 命令的错误):

ls /bootpool 2>/dev/null | grep boot | awk 'NR==1{print $1}'

如果错误来自 grep 命令:

ls /bootpool | grep boot 2>/dev/null | awk 'NR==1{print $1}'

我想你现在明白了。

值得记住的一件好事是:

1= stdout = 命令的正常输出

2= stderr = 命令的错误输出

0= stdin = 命令输入(这对于重定向无用,更多用于日志记录)


我还改进了你的脚本(使用 shellcheck,你可以安装它或使用他们的在线工具关联):

#!/bin/sh
boot=$(find /bootpool/*boot* 2>/dev/null | sed "s|/.*/||")
data=$(find /datapool/*boot* 2>/dev/null | sed "s|/.*/||")
echo "boot"
if [ "$boot" = "boot" ] 
then
        echo "boot"
        pass=$(grep rootpw /bootpool/boot/loader.conf | grep -o '".*"' | sed 's|"||g' | awk 'BEGIN { ORS = " " } { print }')

elif [ "$data" = "boot" ]
then
        pass=$(grep rootpw /datapool/boot/loader.conf | grep -o '".*"' | sed 's|"||g' | awk 'BEGIN { ORS = " " } { print }')

else
        echo "Couldn't find boot in bootpool nor datapool"
        exit
fi

if [ "$pass" = edjos ]
then
        echo "You are at default password. kindly change the password"
        oldpass=$(grep root /etc/master.passwd | awk 'NR==1 { print $1 }' | cut -d ':' -f 2 | sed 's/\$/\%/g')
        passwd
        newpass=$(grep root /etc/master.passwd | awk 'NR==1 { print $1 }' | cut -d ':' -f 2 | sed 's/\$/\%/g')
        if [ "$newpass" != "$oldpass" ]
        then              
                if [ "$boot" = "boot" ]
                then 
                        sed -i.bak '/mfsbsd.rootpw/s/edjos//' /bootpool/boot/loader.conf
                        sed -i.bak '/mfsbsd.rootpwhash/d' /bootpool/boot/loader.conf
                        echo "mfsbsd.rootpwhash=\"$newpass\""  >> /bootpool/boot/loader.conf
                        echo "Great! password updated successfully"

                elif [ "$data" = "boot" ]
                then
                        sed -i.bak '/mfsbsd.rootpw/s/edjos//' /datapool/boot/loader.conf
                        sed -i.bak '/mfsbsd.rootpwhash/d' /datapool/boot/loader.conf
                        echo "mfsbsd.rootpwhash=\"$newpass\""  >> /datapool/boot/loader.conf
                        echo "Great! password updated successfully"
                fi
        fi
else
        echo "Great! you are having authorised password"
fi
  1. 您使用了==,但 /bin/sh 并未使用它。只有=。当您使用 /bin/bash 时,==才会真正有用。但由于您没有使用,因此您需要使用=
  2. 我改变了你设置启动和数据变量的方式。你之前的做法效率很低。
  3. 当 $boot 和 $data 都为空时,脚本会捕获它,而不是让您继续。这很方便,因为在您的第二个 if 语句中,当 $oldpass 和 $newpass 不相等时,它取决于 $boot 或 $data 是否包含“boot”。但如果它们不包含怎么办?这就是else第一个 if 语句中的作用。
  4. 放置""变量。- echo $var>echo "$var"

相关内容