我是bash脚本的新手,需要帮助。
我编写的脚本需要比较用户输入(045、046、287或279的固定选项)。具有其他价值。
当用户输入045或046时,if语句为true并应显示
您已选择$ SID。将使用菜单1
如果用户输入287或279,则该语句需要为false并显示
您已选择$ SID。将使用菜单2
$ SID是上面给出的用户输入。
if [ "$SID" == "046" -o "045" ] ; then
printf "You have choosen $SID. Menu 1 will be used"
else
printf "You have choosen $SID. Menu 2 will be used"
fi
但是在运行脚本时,它始终显示true语句,并在$ SID位置显示用户输入。
You have choosen 045. Menu 1 will be used
You have choosen 046. Menu 1 will be used
You have choosen 287. Menu 1 will be used
You have choosen 279. Menu 1 will be used
我希望这是
使用045或046时:
You have choosen 045. Menu 1 will be used
You have choosen 046. Menu 1 will be used
使用279或287时:
You have choosen 287. Menu 2 will be used
You have choosen 279. Menu 2 will be used
我还尝试了以下if语句,但没有结果:
if [ $SID -eq 046 -o 045 ] ; then
if [ "$SID" -eq "046" -o "045" ] ; then
if [ $SID = 046 -o 045 ] ; then
if [ "$SID" = "046" -o "045" ] ; then
我想念什么?
答案 0 :(得分:3)
-o
连接表达式,而不是单个表达式中的多个值。
if [ "$SID" = 046 -o "$SID" = 045 ] ; then
但是,-o
本身不应该使用;它被认为已过时,并且不能保证由POSIX兼容的shell支持。使用||
来代替连接两个单独的[
命令。
if [ "$SID" = 046 ] || [ "$SID" = 045 ] ; then
case
语句可能更简洁:
case $SID in
045|046) printf 'You have chosen %s. Menu 1 will be used\n' "$SID" ;;
*) printf 'You have chosen %s. Menu 2 will be used\n' "$SID" ;;
esac
这将立即建议(通过使用空格来突出显示)重构
case $SID in
045|046) menu=1 ;;
*) menu=2 ;;
esac
printf 'You have chosen %s. Menu %s will be used\n' "$SID" "$menu"
鉴于您实际上是在使用bash
,因此您可以选择使用[[
命令而不是[
,它允许case
样式的模式匹配:
if [[ $SID = 04[56] ]]; then