我在bash中开发了一个菜单,其中包含一些选项(此处仅包括备份),其中一个选项是备份,但每当我关闭shell时,backup命令都会自行运行并进行备份。
我尝试添加break并退出之前;;但它只是停止了整个剧本。
#!/bin/bash
menu=$(echo "Choose operation [1]Hi [2]Backup")
echo "$menu"
while [ $# == 0 ]; do
read options
case "$options" in
1 )
echo "HI"
echo "$menu"
;;
2 )
dir="/home/backups"
bckup="$(date +%d%b%Y_%H%M)"
mkdir $dir/$bckup
cat /etc/passwd >> $dir/$bckup/"DB$bckup".txt
dialog --title "DATABASE" --msgbox " Ready to backup user database. \n
press <Enter> to start or <Esc> to cancel." 10 50
# Return status of non-zero indicates cancel
if [ "$?" != "0" ]
then
dialog --title "BACKUP" --msgbox " Backup was canceled at your request." 10 50
else
dialog --title "BACKUP" --infobox " Backup in process..." 10 50 ; sleep 1
tar czf $dir/$bckup.tgz -C $dir/$bckup . >|/tmp/ERRORS$$ 2>&1
# zero status indicates backup was successful
if [ "$?" = "0" ]
then
dialog --title "BACKUP" --msgbox " Backup completed successfully." 10 50
else
dialog --title "BACKUP" --msgbox "Backup failed Press <Enter> to see error log." 10 50
dialog --title "Error Log" --textbox /tmp/ERRORS$$ 22 72
fi
fi
rm -r -f $dir/$bckup
rm -f /tmp/ERRORS$$
clear
echo "$menu"
;;
*)
echo "Invalid, Please choose a valid option"
;;
esac
done
exit
答案 0 :(得分:0)
当您输入EOF时会发生什么:
read options
你不测试是否有效。 options
可能包含先前的值,而您之前尝试过备份。如果诊断正确,则修复非常简单:
if read options
then
...the script you currently have interpreting $options
else break # The while loop ... which has an interesting (read 'unusual') condition.
fi
你也可以(应该?)提供一个明确的退出选项,但这样可以在你输入 Control-D 或者你用作终端的EOF指示之后保护你免受意外备份
稍微更激进的重组使用:
if [ $# -eq 0 ]
then
while read options
do
...the script you currently have interpreting $options
done
fi
或:
if [ $# -ne 0 ]
then exit 1
fi
while read options
do
...the script you currently have interpreting $options
done
请告诉我
while [ $# == 0 ];
与[ $# -ne 0 ]
和-eq
之间的区别。
这是shell语义的问题。
while [ $# == 0 ]
对$#
0
的参数数进行字符串相等比较。while [ $# != 0 ]
对参数数量和0进行字符串不等式比较。while [ $# -ne 0 ]
对参数数量和0进行数值不等式比较。while [ $# -eq 0 ]
对参数个数和0进行数字相等比较。请注意,这与Perl约定相反,其中:
$x == 0
是数字相等$x != 0
是数字不等式$x eq 0
是字符串相等$x ne 0
是字符串不等式在所有情况对中,当比较为(in)相等且结果以常规方式表示时(使用最小位数并表示为整数),结果相同。排序比较的数字与字符串比较很重要(>
,<
,>=
,<=
)。
您的原始代码在while [ $# == 0 ]
上循环(虽然没有位置参数)。如果有任何参数(所以$# != 0
或$# > 0
,因为参数的数量永远不会为负),所以永远不会输入循环。
我的第一个重写在进入while read options
循环之前检查没有参数。
如果有任何参数,我的第二个重写会提前退出,因此当参数存在时,根本不会进入while read options
循环。它们是等价的,只是第一次重写使循环体更深一层嵌套。
请注意,所显示的代码都不会更改位置参数的数量(参数数量)。如果你真的想要,你可以用set -- arg1 arg2 ...
来做,但你可能不这样做。