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
は使用されます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
、ユーザーが選択していないコンテンツのみを出力したい場合は、スクリプトの2番目の部分(ループ)を次のように置き換えることができます。
unset values[$user_in]
printf 'You did not pick "%s"\n' "${values[@]}"