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

Sre*_*ala 2 scripts

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

#!/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
Run Code Online (Sandbox Code Playgroud)

Cas*_*Cas 6

您可以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
Run Code Online (Sandbox Code Playgroud)
  1. 您正在使用==但 /bin/sh 没有使用它。仅有的=。当你使用/bin/bash时,==实际上会变得有用。但由于您不这样做,因此您需要使用=.
  2. 我更改了设置引导和数据变量的方式。你的做法效率很低。
  3. 当 $boot 和 $data 都为空时,脚本将捕获它而不是让您继续。这很方便,因为在第二个 if 语句中,当 $oldpass 和 $newpass 不相等时,它取决于 $boot 或 $data 来包含“boot”。但如果他们不这样做怎么办?这就是else第一个 if 语句中的作用。
  4. 放置""变量。echo $var->echo "$var"