如何提示用户从变量或 bash 数组输入?

如何提示用户从变量或 bash 数组输入?

在 bash 脚本中,您将如何编写以下脚本?

USER_INPUT="1 2 3 4 5"
echo "Please select one of the following values: $USER_INPUT"
Prompt the user to choose a value in $USER_INPUT.
echo "command <user input> <iterate through remaining numbers not selected from $USER_INPUT>

例如,如果用户选择“2”,则运行以下命令。

command 2 1
command 2 3
command 2 4
command 2 5

答案1

#!/bin/bash

values=( "Why is" "a raven" "like a" "writing desk?" )

select word in "${values[@]}"; do
    if [[ -z "$word" ]]; then
        printf '"%s" is not a valid choice\n' "$REPLY" >&2
    else
        user_in="$(( REPLY - 1 ))"
        break
    fi
done

for (( i = 0; i < ${#values[@]}; ++i )); do
    if (( i != user_in )); then
        printf 'You did not pick "%s"\n' "${values[$i]}"
    fi
done

select命令将为用户提供一个选择菜单。选择菜单项后,$REPLY将是用户输入的数字,并将$word是菜单中与该数字对应的值。如果做出无效选择,$word将为空。

第二部分$USER_INPUT使用for.bash如果我们遇到与所选值相对应的索引,我们会跳过它。我们打印出数组中的所有其他值。

显然,您可以在循环中执行命令:

for (( i = 0; i < ${#values[@]}; ++i )); do
    if (( i != user_in )); then
        printf 'command %s %s\n' "$user_in" "${values[$i]}"
    fi
done

甚至

for (( i = 0; i < ${#values[@]}; ++i )); do
    if (( i != user_in )); then
        command "${values[$user_in]}" "${values[$i]}"
    fi
done

它将尝试将实际的东西$values作为命令运行。

测试它(使用循环的第一个版本):

$ bash script.sh
1) Why is
2) a raven
3) like a
4) writing desk?
#? B
"B" is not a valid choice
#? 0
"0" is not a valid choice
#? 3
You did not pick "Why is"
You did not pick "a raven"
You did not pick "writing desk?"

如果你能负担得起调整 $values,并且只想输出用户没有选择的东西,那么脚本的第二部分(循环)可以替换为

unset values[$user_in]
printf 'You did not pick "%s"\n' "${values[@]}"

答案2

#!/bin/bash
PROMPT=(1 2 3 4 5)
for i in ${PROMPT[*]}
do
    printf " %d\n" $i
done
echo "Choose an option: "

read var

unset PROMPT[$var-1]
PROMPT_new=(${PROMPT[@]})

for n in ${PROMPT_new[*]}
do
    echo `command $var $n`
done

答案3

在命令行上接受您的输入,而不是以交互方式。 (请!)

这很简单,我只需使用 shell 函数即可。

iter_the_command() {
  max=5
  [ "$#" -eq 1 ] && [ "$1" -ge 1 ] && [ "$1" -le "$max" ] ||
    { printf 'Error: please pass a number from 1 to %d\n' "$max" >&2;
      return 1;}
  for i in $(seq "$max"); do
    [ "$i" -eq "$1" ] && continue
    somecommand "$1" "$i"
  done
}

然而,我强烈怀疑这是一个 XY 问题,而你是什么真的直接尝试做会更容易完成。 (换句话说,我很难想象上面的代码会出现什么情况实际上有用并执行所需的功能,否则效果更好。)

相关内容