사용자 입력으로 bash 배열 검색

사용자 입력으로 bash 배열 검색

모든 사람--

여기 좀 막혔어요. 더 큰 스크립트로 병합될 작은 스크립트가 있습니다. 이 작은 조각은 사용자 입력을 수락하고 이를 저장된 변수 목록과 비교해야 합니다. 사용자 입력이 나열된 변수 중 하나와 일치하면 해당 변수에 대한 문자열을 출력해야 하며, 어떤 요소와도 일치하지 않으면 사용자 입력을 새 변수에 써야 합니다.

문맥상 제가 한 일은 일부 변수를 문자열(이 경우 교과서의 인용 정보)로 정의하는 것이었습니다. 예를 들어:

books=()

buffa7="Wilson, Buffa, Lou. Physics. Pearson, 7th edition, 2009. ISBN: 0321601831"
books=+("$buffa7")

giancoli6="Giancoli, Douglas C. Physics: Principles with Applications. Prentice Hall, 6th edition. ISBN: 0321736990"
books=+("$giancoli6")

이 코드에 대한 나의 이해는 배열을 생성 books하고 변수를 가져와 $buffa7목록 $giancoli6에 추가한다는 것입니다. 내가 원하는 것은 사용자에게 소스에 대한 입력을 요청하는 것입니다. 사용자가 buffa7또는 를 입력하면 해당 변수에 할당된 텍스트로 giancoli6변수가 재정의되어야 합니다 . $source사용자 입력이 이와 일치하지 않으면 변수는 $source사용자가 입력한 대로 정의되어야 합니다.

내가 겪고 있는 것 같은 문제 는 사용자가 소스 정보를 입력할 때 yes를 buffa7사용하는 경우입니다 . 진행 방법에 대한 제안 사항이 있으면 크게 감사하겠습니다!buffa7buffa7$buffa7

답변1

이는 이름 참조나 변수 간접 지정을 사용하여 수행할 수 있지만 수행해야 할 작업은 연관 배열을 사용하는 것입니다. 연관 배열이 전체 항목을 처리할 수 있으면 각 항목에 대해 변수를 사용할 필요가 없습니다.

declare -A books
books[buffa7]="Wilson, Buffa, Lou. Physics. Pearson, 7th edition, 2009. ISBN: 0321601831"
books[giancoli6]="Giancoli, Douglas C. Physics: Principles with Applications. Prentice Hall, 6th edition. ISBN: 0321736990"

그 다음에:

read input
source=${books[$input]}   # set $source to entry from array
if [[ -z $source ]]       # if $source is empty after that
then                      # $input was not in array, so
    source=$input         # set $source to $input.
fi

관련 정보