从 bash 菜单中填充变量

fill variable from bash menu

这是一个非常简单的菜单:

VAR=""
PS3='Make a selection: '
options=("opt 1" "opt 2" "opt 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "opt 1")
            echo "opt 1 selected"
            ;;
        "opt 2")
            echo "opt 2 selected"
            ;;
        "opt 3")
            echo "opt 3 selected"
            ;;
        "Quit")
            break
            ;;
        *) echo "invalid option $REPLY";;
    esac
done

我想为每个选项添加以下内容: 例如,如果选择“opt 1”:

[[ $(VAR) ]] && VAR="${VAR}\|123" || VAR=123

对于“选项 2”,456

对于“选项 3”,789

最后,我们应该有: VAR=123\|789 如果选择了“opt 1”和“opt 3”

或 如果只选择了“选项 3”,则 VAR=789。

我面临的问题是我填充 VAR 的语法不起作用:退出菜单后 VAR 保持为空。

谢谢大家!

希望对您有所帮助。与其中的 case 相比,它的编程更少。

#! /bin/bash

VAR=""

# Declare options and values for options
declare -A OPTIONS
OPTIONS[opt 1]="123"
OPTIONS[opt 2]="456"
OPTIONS[opt 3]="789"

echo "Options: ${!OPTIONS[@]}"
while read -r -p "Make a selection: " opt; do

        # If opt becomes quit or Quit, break from loop.
        ! [[ $opt =~ (Q|q)uit ]] || break

        if [[ ${OPTIONS[$opt]}x == "x" ]]; then
                echo "$opt unknown"
        else
                VAR+=${OPTIONS[$opt]}
        fi
done

echo $VAR
exit 0

遵循您的方法。

您缺少导出变量 VAR 以便在脚本执行后可用。

VAR=""
PS3='Make a selection: '
options=("opt 1" "opt 2" "opt 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "opt 1")
            echo "opt 1 selected"
            VAR="${VAR}\|123"
            ;;
        "opt 2")
            echo "opt 2 selected"
           VAR="${VAR}\|456"
            ;;
        "opt 3")
            echo "opt 3 selected"
           VAR="${VAR}\|789"
            ;;
        "Quit")
            break
            ;;
        *) echo "invalid option $REPLY"
                echo $VAR ;;
    esac
done
export VAR

但是,导出仅适用于子进程。作为解决方法,您可以将脚本执行为 . test.sh

输出示例:

[10:08:18][/]# . test.sh
1) opt 1
2) opt 2
3) opt 3
4) Quit
Make a selection: 1
opt 1 selected
Make a selection: 2
opt 2 selected
Make a selection: 4
[10:08:18][/]#echo $VAR
\|123\|456

您可以修改为变量赋值的方式以获得所需的输出。

通过添加点作为执行方式,您正在获取变量。更多信息在这里:Export variable from bash