일부 함수 매개변수를 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 bar
vs. foo
및 bar
. printf ":%s\n" "${array[@]}"
가 약간 더 좋을 것입니다. 최소한 데이터에 개행 문자가 포함되기 시작하거나 배열이 비어 있을 때까지).