我有一个安装Windows共享的脚本,我正在研究它来学习bash脚本。
我遇到的问题是,有一个结果是用zenity写的,因为一旦安装了共享,当它无法挂载时会发出确定,它会发出 FAIL
现在我想再次询问用户他的密码,如果输出 FAIL ,那么如果她/他在密码中有错误,她/他可以重写它。
输入
## define a function that launched the zenity username dialog
get_password(){
zenity --entry --width=300 --title="Mount $MOUNTDIR" --text="Password:" --hide-text
}
# attempt to get the password and exit if cancel was pressed
wPassword=$(get_password) || exit
# if the username is empty or matches only whitespace.
while [ "$(expr match "$wPassword" '.')" -lt "1" ]; do
zenity --error --title="Error in password!" --text="Please check your password! Password field can not be empty!" || exit
wPassword=$(get_password) || exit
done
输出:
# show if mounting was OK or failed
if [ $? -eq 0 ]; then
zenity --info --title="Mounting public share succeeded!" --text="Location Documents/Shares/public!"
else
zenity --error --title="Mounting public did not succeed!" --text="Please contact system administrator!"
fi
因此,如果输出是失败,我需要脚本重新运行输入。我希望你明白我的需要。
答案 0 :(得分:1)
我认为你所追求的是:
while wPassword=$(get_password)
do
if mount …options for mount…
then
zenity --info --title="Mounting public share succeeded!" \
--text="Location Documents/Shares/public!"
break
else
zenity --error --title="Mounting public did not succeed!" \
--text="Please contact system administrator!"
fi
done
这将运行get_password
函数并保存输出;如果get_password
函数返回非零状态,则循环将终止。在循环体中,它运行mount
命令,如果成功,则报告成功并中断循环。如果失败,它会给出一条错误消息(不再有完全合适的消息),然后返回循环读取新密码。
...但问题是我在脚本中保存了密码功能,我需要在它成功之前启动它。
有多种选择:
while wPassword=$(get_password)
do
if ! password_saver "$wPassword"
then break # Password saver reported error, presumably
fi
if mount …options for mount…
…
或者:
while wPassword=$(get_password) &&
password_saver "$wPassword"
do
if mount …options for mount…
…
如果密码保护程序仅指示错误而非报告错误,那么您需要在代码中报告问题;这将使第一个选择更好。您可以将break
替换为continue
以再次绕过循环。如果'停止循环密码保护程序错误'是正确的,然后第二个更简洁。