如何以非交互方式将值传递给PS3?

时间:2017-01-03 07:19:30

标签: bash shell

我有一个交互式脚本,我应该以非交互方式传递一些值

交互式脚本会打印选项列表'使用' 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提示符。有任何帮助或建议吗?

2 个答案:

答案 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