我正在编写一个脚本,但是当找不到某些东西时它会抛出一些错误,我需要忽略这些错误。我的意思是当我运行脚本时如果不应该显示任何错误它应该显示积极的结果。
#!/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
- 您使用了
==
,但 /bin/sh 并未使用它。只有=
。当您使用 /bin/bash 时,==
才会真正有用。但由于您没有使用,因此您需要使用=
。 - 我改变了你设置启动和数据变量的方式。你之前的做法效率很低。
- 当 $boot 和 $data 都为空时,脚本会捕获它,而不是让您继续。这很方便,因为在您的第二个 if 语句中,当 $oldpass 和 $newpass 不相等时,它取决于 $boot 或 $data 是否包含“boot”。但如果它们不包含怎么办?这就是
else
第一个 if 语句中的作用。 - 放置
""
变量。-echo $var
>echo "$var"