변수나 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

대화형이 아닌 명령줄에서 입력을 받아들입니다. (제발!)

쉽습니다. 저는 단지 쉘 기능을 사용합니다.

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 문제라고 강하게 의심하는데, 당신은 무엇입니까?진짜그냥 하려고 하면 하는게 더 쉽습니다. (즉, 위의 코드에서 어떤 일이 일어날지 상상하기 어렵습니다.실제로유용하고 필요한 기능을 수행하십시오. 그렇지 않으면 더 좋을 것입니다. )

관련 정보