함수 인수로 사용되는 환경 변수를 포함하는 Bash 배열

함수 인수로 사용되는 환경 변수를 포함하는 Bash 배열

일부 함수 매개변수를 bash 배열에 저장하려고 하는데 그 중 일부는 환경 변수의 내용을 기반으로 정의되어 있으며 실제로 실제 값으로 "확장"되지는 않습니다. (충분히 명확하길 바랍니다.) :

예:

fileprefix='20200222_*'
test=1
args=( '-F' )
[[ "${test}" == 1 ]] && args+=( '-la "${fileprefix}"' )

그러나 다음을 실행하면 오류가 보고됩니다.

$ ls "${args[@]}"

ls: invalid option -- ' '
Try 'ls --help' for more information.

그리고:

$ echo "${args[@]}"

-F -la "${fileprefix}"

하지만:

$ echo "${fileprefix}"
20200222_*

나는 기대:

$ ls "${args[@]}"

-rw-r--r-- 1 user user 0 Jul  4 19:37 20200222_a.txt
-rw-r--r-- 1 user user 0 Jul  4 19:38 20200222_b.txt
-rw-r--r-- 1 user user 0 Jul  4 19:39 20200222_c.txt
-rw-r--r-- 1 user user 0 Jul  4 19:40 20200222_d.txt

그래서 내 질문은: ${fileprefix}매개변수 배열을 사용하여 명령을 실행할 때 변수의 내용을 어떻게 "확장"합니까?ls

나는 여기서 흥미로운 것을 찾지 못했습니다.https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html

답변1

... args+=( '-la "${fileprefix}"' )

여기에서는 '-la "${fileprefix}"'따옴표가 붙어 있으므로 공백, 따옴표, 달러 기호, 중괄호 및 모든 항목과 함께 배열의 요소로 저장됩니다. ${fileprefix}문자열이 작은따옴표로 묶여 있으므로 확장 되지 않습니다 . ls결국 이를 완전한 매개변수로 취한 다음 공백이 유효한 옵션 문자가 아니라고 불평합니다.

너가 ~ 한 뒤로생각하다 ${fileprefix}확장하여 파일 이름 패턴 /glob로 사용하려면 이를 유지해야 합니다.인용되지 않음. (또한 토큰화되므로 IFS공백이 포함되어 있는지(또는 기본값이 아닌 다른 것으로 변경하는지) 문제가 됩니다.) 또한 -la다른 요소를 만들어야 합니다.

그래서:

args+=( -la ${fileprefix} )

(이것은 echo "${args[@]}"배열을 보는 좋은 방법이 아닙니다. echo공백으로 연결된 모든 인수가 인쇄되므로 공백이 있는 배열 요소 하나와 공백이 없는 두 배열 요소를 구별하기가 어렵습니다. 예를 들어 foo barvs. foobar. printf ":%s\n" "${array[@]}"가 약간 더 좋을 것입니다. 최소한 데이터에 개행 문자가 포함되기 시작하거나 배열이 비어 있을 때까지).

관련 정보