if-else 조건을 확인하기 위해 사용자 입력 문자열을 전달합니다.

if-else 조건을 확인하기 위해 사용자 입력 문자열을 전달합니다.
str1="ace"
str2="com"
str3="ros"
$name = readinput(Enter name:)

if [[ "$name" == "$str1" ]]; 
then

run ace.txt
else
if [[ "$name" == "$str2" ]];
then

run commscope.txt
else
if [[ "$name" == "$str3" ]];
then

run rosgenberger.txt
else
echo "no match found"
fi
fi
fi

스크립트가 실행되지 않습니다. 도와주세요. 내가 원하는 행동은 다음과 같아야합니다

  • 사용자 입력이 "ace"인 경우 --- ace.txt를 실행해야 합니다.
  • 사용자 입력이 "com"인 경우 --- commscope.txt를 실행해야 합니다.
  • 사용자 입력이 "ros"인 경우 --- run rosgenberger.txt가 실행되어야 합니다.

ace.txt/commscope.txt/rosgenberger.txt 스크립트가 있는 경로에서 이 스크립트를 실행합니다.

답변1

다음과 같은 작업을 수행할 수 있습니다.

#!/bin/sh

printf 'Enter name: ' >&2
read -r name

case $name in
    ace)
        run ace.txt
        ;;
    com)
        run commscope.txt
        ;;
    ros)
        run rosgenberger.txt
        ;;
    *)
        printf 'No match for "%s"\n' "$name"
esac

사용자로부터 "이름"을 읽고 사용자의 응답에 따라 명령을 실행합니다.

bash셸 에서는 좀 더 간소화된 방법을 사용할 수 있습니다.

#!/bin/bash

declare -A map=(
    [ace]=ace.txt
    [com]=commscope.txt
    [ros]=rosgenberger.txt
)

read -p 'Enter name: ' -r name

if [[ -n ${map[$name]} ]]; then
    run "${map[$name]}"
else
    printf 'No match for "%s"\n' "$name"
fi

그러면 예상되는 "이름"을 키로, 해당 파일 이름을 값으로 사용하여 연관 배열이 설정됩니다. 사용자의 입력에 따라 명령은 올바른 파일 이름을 사용합니다 run.

그러나 대부분의 경우 사용자와 상호 작용하기를 원하지 않고 대신 사용자가 명령줄 옵션을 통해 간단히 입력을 제공하도록 허용합니다. 다음은 명령줄을 통해 전달된 첫 번째 인수를 기본값으로 사용하여 입력에 대한 대화형 프롬프트를 우회합니다 name.

#!/bin/bash

name=$1

declare -A map=(
    [ace]=ace.txt
    [com]=commscope.txt
    [ros]=rosgenberger.txt
)

if [[ -z $name ]]; then
    read -p 'Enter name: ' -r name
fi

if [[ -n ${map[$name]} ]]; then
    run "${map[$name]}"
else
    printf 'No match for "%s"\n' "$name"
fi

이는 다음과 같이 사용됩니다:

./myscript ace

... 예를 들어. 그러면 스크립트는 대화형 질문을 우회하고 실행됩니다 run ace.txt.

run명령에 필요한 변수 확장을 통해 오류 보고를 완료함으로써 코드를 더욱 간소화할 수 있습니다.

#!/bin/bash

name=$1

declare -A map=(
    [ace]=ace.txt
    [com]=commscope.txt
    [ros]=rosgenberger.txt
)

if [[ -z $name ]]; then
    read -p 'Enter name: ' -r name
fi

run "${map[$name]?Name $name not matched}"

이것은 다음과 같이 출력됩니다

line 15: map[$name]: Name Boo not matched

사용자가 이름을 입력하는 경우 Boo.

답변2

Bash 셸을 사용한다고 가정하고 이 줄을 자세히 살펴보세요. 함수가 정의 되지 않았 readinput()으므로 실패합니다.

$name = readinput(Enter name:)

또한 변수 할당에는 양쪽에 공백이 있어서는 안 됩니다 =. 할당에는 문자가 앞에 붙으면 안 됩니다 $. 어쩌면 이것을 시도해보십시오:

echo -n "Enter name:"
read name

또한 @AdminBee가 제안한 대로 스크립트 시작 부분에 shebang을 추가해야 합니다.

관련 정보