선택 루프가 배열에 저장된 문자열의 공간을 처리하지 않습니다.

선택 루프가 배열에 저장된 문자열의 공간을 처리하지 않습니다.

과제의 선택적 부분으로 select를 사용하여 대화형 메뉴를 만들고 공백이 포함된 파일 및 디렉터리 이름을 지원하도록 만들고 있습니다. 요점은 사용자가 상호 작용 메뉴에서 이미 결정된 특정 기능을 사용하여 상호 작용할 파일이나 디렉터리를 선택할 수 있다는 것입니다. 요구 사항의 일부로 select를 사용해야 합니다. 이 예에서는 cat을 사용하여 파일의 저장 정보를 얻으려고 합니다.

하지만 이건 작동하지 않아

shopt -s nullglob
FARRAY= (*)
shopt -u nullglob
PS3= "Please select a file"
select SHOLDER in "${FARRAY[@]}"
do
   if  test -d "${FARRAY[$SHOLDER]}"
   then
       echo "Please select a file"
   else
       cat "${FARRAY[$SHOLDER]}"
       break
   fi
done

오류가 발생합니다. 표현식에 구문 오류가 있습니다(오류 토큰이 "거기"입니다). 안녕하세요 제가 테스트한 파일명입니다

선택 루프와 cat 부분의 배열 이름 앞에 "!"를 추가하면 "${!FARRAY[@]}" 작동하지만 사용자에게 실제로 사용할 수 없는 파일 이름이 아닌 배열 인덱스만 표시됩니다. 왜 이런 일이 발생하는지, 그리고 스크립트가 이 부분을 올바르게 수행하도록 하려면 어떤 단계를 수행해야 하는지 알고 싶습니다.

답변1

에서 help select:

select: select NAME [in WORDS ... ;] do COMMANDS; done

[...] 행이 표시된 단어 중 하나에 해당하는 숫자로 구성되면 NAME이 해당 단어로 설정됩니다.

예를 들어:

$ select foo in abc def; do echo "foo is '$foo'"; break; done
1) abc
2) def
#? 2
foo is 'def'

즉, 이름이 지정된 파일을 선택한 foo.c다음 (파일 수 대신) SHOLDER로 설정 하면 배열에 인덱싱할 때 산술 오류가 발생합니다.foo.c

select옵션의 번호는 1부터 시작하는 반면 Bash 배열의 색인은 0부터 시작하므로 문제가 발생할 수도 있습니다 .

질문을 복잡하게 만드는 오타를 방지하려면 여기 질문에 코드를 복사하여 붙여넣는 것이 가장 좋습니다. 이 할당의 공백과 마찬가지로 FARRAY= (*)구문 오류가 발생합니다.

관련 정보