変数または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空になります。

2番目の部分$USER_INPUTは使用されますforbash選択した値に対応するインデックスがある場合はスキップします。配列の他のすべての値を印刷します。

明らかに、ループでコマンドを実行できます。

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、ユーザーが選択していないコンテンツのみを出力したい場合は、スクリプトの2番目の部分(ループ)を次のように置き換えることができます。

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

対話型ではなくコマンドラインから入力を受け入れます。 (お願いします!)

簡単です。私は単にシェル機能を使用します。

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問題であると強く疑っていますが、あなたは何ですか?本物ちょうどやろうとするのは簡単です。 (つまり、上記のコードで何が起こるのか想像するのは難しいです。実際に便利で必要な機能を実行します。そうでなければ、より良いでしょう。 )

関連情報