Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中按索引值使用case语句?_Bash_Shell_Terminal - Fatal编程技术网

如何在bash中按索引值使用case语句?

如何在bash中按索引值使用case语句?,bash,shell,terminal,Bash,Shell,Terminal,我有以下代码,其中用户选择一种文件类型,然后针对每种情况运行特定代码: #!/bin/bash PS3='Please enter your file type choice: ' options=(".c (C)" \ ".cpp (C++)" \ ".css (CSS)" \ ".html (HTML)" \ ".java (Java)

我有以下代码,其中用户选择一种文件类型,然后针对每种情况运行特定代码:

#!/bin/bash

PS3='Please enter your file type choice: '

options=(".c (C)" \
        ".cpp (C++)" \
        ".css (CSS)" \
        ".html (HTML)" \
        ".java (Java)" \
        ".ms (Groff)") 

select option in "${options[@]}" # Asks for the option choice
do
    case "${option}" in
        ".c (C)") # C programming file
            echo "C OPTION SELECTED"
            ;;
        ".cpp (C++)") # C++ programming file
            echo "C++ OPTION SELECTED"
            ;;
        ".css (CSS)") # CSS programming file
            echo "CSS OPTION SELECTED"
            ;;
        ".html (HTML)") # HTML File
            echo "HTML OPTION SELECTED"
            ;;
        ".java (Java)") # Java programming file
            echo "JAVA OPTION SELECTED"
            ;;
        ".ms (Groff)") # Groff markup file
            echo "GROFF OPTION SELECTED"
            ;;
        *) echo "invalid option $option"
           ;;
    esac
done
我想知道如何做到这一点,在case语句中,您可以通过数组的索引而不是数组的值来处理每个case:

#!/bin/bash

PS3='Please enter your file type choice: '

options=(".c (C)" \
        ".cpp (C++)" \
        ".css (CSS)" \
        ".html (HTML)" \
        ".java (Java)" \
        ".ms (Groff)") 

select option in "${options[@]}" # Asks for the option choice
do
    case "${option}" in
        1) # C programming file
            echo "C OPTION SELECTED"
            ;;
        2) # C++ programming file
            echo "C++ OPTION SELECTED"
            ;;
        3) # CSS programming file
            echo "CSS OPTION SELECTED"
            ;;
        4) # HTML File
            echo "HTML OPTION SELECTED"
            ;;
        5) # Java programming file
            echo "JAVA OPTION SELECTED"
            ;;
        6) # Groff markup file
            echo "GROFF OPTION SELECTED"
            ;;
        *) echo "invalid option $option"
            ;;
    esac
done

我做了很多研究,但我并不擅长bash(但我正在学习)。很抱歉,如果解决方案显而易见,但我将感谢您的帮助,即您。

帮助选项中

读取的行保存在变量
REPLY


在bash 4.0或更新版本上,可以将反向索引构建为关联数组:

declare -A options_reverse=()
for idx in "${!options[@]}"; do
  val=${options[$idx]}
  options_reverse[$val]=$idx
done
…执行此操作后,
${options\u reverse[$option]}
将映射到所需的索引

与程序的其余部分结合起来,这看起来像:

#!/bin/bash
case $BASH_VERSION in ''|[0-3].*) echo "ERROR: Bash 4.0+ required" >&2; exit 1;; esac

PS3='Please enter your file type choice: '

options=(
  ".c (C)"
  ".cpp (C++)"
  ".css (CSS)"
  ".html (HTML)"
  ".java (Java)"
  ".ms (Groff)"
)

declare -A options_reverse=()
for idx in "${!options[@]}"; do
  val=${options[$idx]}
  options_reverse[$val]=$idx
done

select option in "${options[@]}"; do
  case "${options_reverse[$option]}" in
    0) echo "C OPTION SELECTED";;
    1) echo "C++ OPTION SELECTED";;
    2) echo "CSS OPTION SELECTED";;
    3) echo "HTML OPTION SELECTED";;
    4) echo "JAVA OPTION SELECTED";;
    5) echo "GROFF OPTION SELECTED";;
    *) echo "invalid option $option";;
  esac
done

我不相信这对我有帮助。我希望通过数组中回复的索引来访问它,而不是通过回复来访问每个案例。如果我有array=(“first”“second”“third”),我想按1、2、3(或者0、1、2,取决于bash使用的是什么)访问它。如果键入
3
并按enter键,那么REPLY将包含
3
,而不是
。css(css)
,所以这是有效的(但必须减去1,因为
select
显示基于1,而bash数组是基于0的)请注意,
sh
根本不支持数组,这意味着它拥有的数据类型没有索引,因此我不清楚为什么在这里标记它。抱歉,我将删除它。另外,请注意索引从0开始,而不是从1开始。
选项
结构在这里真的是一个不错的选择吗?它的要点是让用户输入一个数字,而不是在完整选项中键入,但您希望将其转换回一个数字。。。它甚至不会是相同的数字,因为bash数组是零索引的!为什么不自己打印数字和选项,并使用
read
直接获取选项编号?在
select
之后,索引在
$REPLY
中。虽然我确实看到了您的操作步骤,但for循环中的
选项反向[$val]=$idx
似乎有错误。它告诉我“第17行:.c(c):语法错误:应为操作数(错误标记为“.c(c)”)。@HusseinEsmail,…请在的在线解释器中查看它与bash 5.0.3的正确工作情况(正如我在回答中所说,它应适用于任何高于4.0的版本;在4.0之前,根本不支持关联数组)。@HusseinEsmail,任何版本的bash如果在该行上有问题,那么它的
declare-a也会有问题。我不认为您可能将其更改为
declare-a
?它们不是同一件事。@HusseinEsmail我可以确认答案中的代码在
bash
4.4.20版(我目前拥有的最低版本)上正常工作。@CharlesDuffy我注意到我的mac电脑仍然在bash 3.7版上。我现在正在更新它,在我正确更新它之后,我将再次测试这段代码。