런타임에만 아는 특정 확장자를 가진 모든 파일을 나열해야 합니다(예: 특정 파일). 또는 확장자가 변수에 저장됩니다.
fd
명령을 사용하여 나열하고 싶습니다 . 여러 확장자를 가진 모든 파일을 나열하는 명령은 fd -e java -e c ...
.
나는 그것을 관리하기 위해 두 가지 방법을 시도했지만 둘 다 보기 흉해 보입니다.
!/bin/zsh
str="c java"
extensions=(${=str})
arguments=(" -e "${^extensions})
# Why `arguments=" -e "${^extensions};echo $arguments` output -e c java
fd ${=arguments}
!/bin/zsh
str="c java"
extensions=(${=str})
option=(" -e ")
arguments=${option:^^extensions}
fd ${=arguments}
이런 한줄 코드가 있었으면 좋겠습니다 fd ${=${(" -e "):^^(${=str})}}
.
또 다른 질문이 있습니다. 첫 번째 코드 블록에서 arguments=" -e "${^extensions};echo $arguments
"-ec -e java\n" 대신 "-ec java\n"이 출력되는 이유는 무엇입니까 arguments=(" -e "${^extensions}); echo $arguments
?
답변1
다시 분할하기 전에 분할 str
한 다음 -e
각 배열 요소에 추가합니다.
% str="c java"
% print -lr -- ${=${${=str}/#/-e }}
-e
c
-e
java
첫 번째 단계는 문자열을 목록으로 분할하는 것이므로 필요 이상으로 추악하고 취약합니다. 목록을 배열에 넣으면 앞에 추가한 다음 분할할 수 있습니다.
% a=(c java)
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java
그러나 분할은 IFS
짧지만 공백이 포함된 입력(또는 더 일반적으로 문자)에서 분할되므로 올바르지 않습니다 $IFS
.
% a=(c java "with spaces")
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java
-e
with
spaces
매개변수 확장이 포함된 올바른 한 줄의 코드가 없다고 생각합니다. P
glob으로 한 가지를 활용하고 이를 다른 배열로 대체할 수 있는 보기 흉한 glob 한정자가 있습니다 .
% a=(c java "with spaces")
% print -lr -- .(P\''-e'\'e\''reply=($a)'\')
-e
c
-e
java
-e
with spaces
str="c java" extensions=(${=str}) # Why `arguments=" -e "${^extensions};echo $arguments` output -e c java
문자열을 생성하고 있기 때문입니다. 문자열 컨텍스트에서는 이 ^
플래그가 적용되지 않습니다. 이것이 하는 일은 개별 배열 요소를 생성하는 것이지만, 컨텍스트가 배열을 허용하지 않는 경우에는 이 작업을 수행할 수 없습니다.