从 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
这是一个非常简单的菜单:
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