📜  Shell 脚本 - 选择循环

📅  最后修改于: 2022-05-13 01:57:33.244000             🧑  作者: Mango

Shell 脚本 - 选择循环

选择循环是 bash 编程中的循环类别之一。只有在有 break 语句或键盘中断时,shell 中的选择循环才能在两种情况下停止。使用选择循环的主要目的是它以编号列表的形式向用户表示不同的数据元素。用户可以轻松地选择程序列出的选项之一。

一般选择循环的语法如下所示,

句法:

select myVariable in variable1 variable2 ... variableN
do
    # body to be executed for 
    # every value in the sequence.
done

这里,myVariable 是一个变量,用于引用从 variable1 到 variableN 的每个值。

示例 1:

在下面的程序中,我们创建了一个编号菜单,以允许用户(或 Btech 学生)选择部门。

源代码:

# Program to demonstrate the working of a 
# select-loop in shell scripting

# PS3="Enter your choice ==> "
# echo "What is your department?"
 
select department in CS IT ECE EE
do
  case $department in

     CS)
        echo "I am from CS department."
        ;;

 IT)
        echo "I am from IT department."
     ;;

      ECE)
        echo "I am from ECE department."
     ;;

 EE)
        echo "I am from EE department."
     ;;

     none)
        break
     ;;

     *) echo "Invalid selection"
     ;;
  esac
done

输出:

示例 2:

在下面的程序中,我们正在创建一个编号菜单以允许用户选择一个数字。一旦用户选择了一个数字,我们就会显示该数字是偶数还是奇数。

源代码:

# Program to demonstrate the working of
# a select-loop in shell scripting

# PS3="Enter your choice ==> "
# echo "Choose a number:"
  
select num in 1 2 3 4 5 6 7
do
   case $num in
      2|4|6|8) 
         echo "Even number."
         ;;
      1|3|5|7)
         echo "Odd number."
      ;;
      none) 
         break 
      ;;
      *) echo "ERROR: Invalid selection" 
      ;;
   esac
done

输出:

选择带有输入提示的循环:

借助 bash 编程中的 PS3 变量,我们可以在要求从菜单中进行任何选择之前提示用户。该变量必须在选择循环之前声明。用于初始化 PS3 变量的值或字符串用于在控制台上提示用户。

示例 1:

在下面的程序中,我们提示用户“输入您的选择 ==>”。

源代码:

# Program to demonstrate the working of a 
# select-loop in shell scripting

PS3="Enter your choice ==> "
echo "What is your department?"
  
select department in CS IT ECE EE
do
   case $department in

      CS) 
         echo "I am from CS department."
         ;;

        IT)
         echo "I am from IT department."
      ;;

       ECE)
         echo "I am from ECE department."
      ;;

        EE)
         echo "I am from EE department."
      ;;
 
      none) 
         break 
      ;;

      *) echo "Invalid selection" 
      ;;
   esac
done

输出:

示例 2:

在这个程序中,我们提示用户“输入您的选择 ==>”。

源代码:

# Program to demonstrate the working of a 
# select-loop in shell scripting

PS3="Enter your choice ==> "
echo "Choose a number:"
  
select num in 1 2 3 4 5 6 7
do
   case $num in
      2|4|6|8) 
         echo "Even number."
         ;;
      1|3|5|7)
         echo "Odd number."
      ;;
      none) 
         break 
      ;;
      *) echo "ERROR: Invalid selection" 
      ;;
   esac
done

输出:

将选项输出到 bash 中的选择循环

当到达输入的文件结尾 (EOF) 时,选择循环在 bash 中完成。但是对于通过管道输出到我们脚本的命令,前一个命令的输出将成为当前命令的输入。

让我们了解一下管道命令在 bash 中的含义。管道被认为是 shell 中最强大的运算符之一。它由符号 (|) 表示。管道获取一个命令的输出并将其用作另一个命令的输入。而且,我们不限于单个管道命令,但我们可以将它们堆叠任意多次,或者直到您用完输出或文件描述符。但是在使用管道输出命令的选择循环的情况下,可能会导致没有输出,如下面的程序所示。

例子:

源代码:

# Program to demonstrate the working of a 
# select-loop in shell scripting

# script: select-loop-bash.sh
select department in CS IT ECE EE
do
   case $department in

      CS) 
         echo "I am from CS department."
         ;;

        IT)
         echo "I am from IT department."
      ;;

       ECE)
         echo "I am from ECE department."
      ;;

        EE)
         echo "I am from EE department."
      ;;
 
      none) 
         break 
      ;;

      *) echo "Invalid selection" 
      ;;
   esac
done

交互式命令(一个接一个)和输出:

管道:

使用管道输出命令时如何修复没有输出?

这个问题可以通过确保从“/dev/tty”读取选择菜单并且我们使用“echo”或“printf”命令传递带有正确单词分隔符的选项来解决。

例子:

源代码:

# Program to demonstrate the working of a 
# select-loop in shell scripting

# script: select-loop-bash.sh
select department in CS IT ECE EE
do
   case $department in

      CS) 
         echo "I am from CS department."
         ;;

        IT)
         echo "I am from IT department."
      ;;

       ECE)
         echo "I am from ECE department."
      ;;

        EE)
         echo "I am from EE department."
      ;;
 
      none) 
         break 
      ;;

      *) echo "Invalid selection" 
      ;;
   esac
done < /dev/tty

交互式命令(一个接一个)和输出: