我有一个交互式脚本,我应该以非交互方式传递一些值
交互式脚本会打印选项列表'使用' PS3'变量
PS3='Select the platform to use:'
ex输出如下所示
echo 'Linux Build System initializing'
1) Linux PC based
2) ABC 1
3) XYZ 4
Select the platform to use: <waits for user input>
我想将值传递给PS3提示符。有任何帮助或建议吗?
答案 0 :(得分:1)
您可以使用select
内置功能实现此目的,
PS3='Select the platform to use: '
select choice in $(seq 3)
do
[[ $choice -eq 1 ]] && echo "Linux PC based"
[[ $choice -eq 2 ]] && echo "ABC 1"
[[ $choice -eq 3 ]] && echo "XYZ 4"
break
done
确保export
PS3
中的~/.bashrc
值使其永久化。另外值得添加一点,select
不是POSIX
兼容选项,可能无法跨平台移植。
你可以在一个脚本中调用它并在另一个脚本中调用它的方法是将上面的代码包装在一个函数中,将source
包装在另一个文件中。在原始脚本上,例如说script1.sh
,将函数包装为
#!/bin/bash
function optselect() {
arg1=$1
select arg1 in $(seq 3)
do
[[ $arg1 -eq 1 ]] && echo "Linux PC based"
[[ $arg1 -eq 2 ]] && echo "ABC 1"
[[ $arg1 -eq 3 ]] && echo "XYZ 4"
break
done
}
然后在调用脚本中,例如说script2.sh
#!/bin/bash
source ./script1.sh
optselect 1 # Calling the script with argument '1'
答案 1 :(得分:0)
在case
语句中使用select
语句。如果进行了无效选择,case
语句将使用continue
返回select
语句的顶部。否则,请在 break
语句后使用case
退出select
循环。
PS3='Select the platform to use: '
select choice in "Linux PC based" "ABC 1" "XYZ 4"
do
case $choice in
1) echo "You chose Linux" ;;
2) echo "You chose ABC" ;;
3) echo "You chose XYZ" ;;
*) continue
esac
break
done