我正在编写一个脚本,但是当找不到某些内容时它会抛出一些错误,我需要忽略这些错误。我的意思是当我运行脚本时,如果不应该显示任何错误,它应该显示积极的结果。
#!/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)
您可以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)
==
但 /bin/sh 没有使用它。仅有的=
。当你使用/bin/bash时,==
实际上会变得有用。但由于您不这样做,因此您需要使用=
.else
第一个 if 语句中的作用。""
变量。echo $var
->echo "$var"