Ubuntu 14.04.5 LTS GNU bash, 버전 4.3.11(1)-릴리스(x86_64-pc-linux-gnu)
mkdir -vp test{1..3}/{a,b,c}
잘 작동
mkdir: created directory 'test1'
mkdir: created directory 'test1/a'
mkdir: created directory 'test1/b'
mkdir: created directory 'test1/c'
mkdir: created directory 'test2'
mkdir: created directory 'test2/a'
mkdir: created directory 'test2/b'
mkdir: created directory 'test2/c'
mkdir: created directory 'test3'
mkdir: created directory 'test3/a'
mkdir: created directory 'test3/b'
mkdir: created directory 'test3/c'
S=1;E=3; LANG=EN mkdir -pv test{$S..$E}/{a,b,c}
mkdir: created directory 'test{1..3}'
mkdir: created directory 'test{1..3}/a'
mkdir: created directory 'test{1..3}/b'
mkdir: created directory 'test{1..3}/c'
작동하지 않는 것 같습니다.
실패는 작은따옴표와 큰따옴표입니다.
S=1;E=3; LANG=EN mkdir -pv 'test{$S..$E}/{a,b,c}'
mkdir: created directory 'test{$S..$E}'
mkdir: created directory 'test{$S..$E}/{a,b,c}'
S=1;E=3; LANG=EN mkdir -pv 'test{'$S'..'$E'}/{a,b,c}'
mkdir: created directory 'test{1..3}'
mkdir: created directory 'test{1..3}/{a,b,c}'
S=1;E=3; LANG=EN mkdir -pv "test{S1..S3}/{a,b,c}"
mkdir: created directory 'test{S1..S3}'
mkdir: created directory 'test{S1..S3}/{a,b,c}'
for 루프를 사용하거나, 매개변수 수에 제한이 있거나, 폴더에 문제가 있거나, printf 또는 "유사한 문제" 섹션에 표시된 유사한 설정을 사용할 수 있다는 것을 알고 있습니다.
그러나 나는 이 특정 와일드카드 사례가 왜 실패했는지 알고 싶습니다.
이 질문의 댓글에서 가능한 해결책을 찾았습니다.
Bash 스크립트 작은따옴표 매개변수 및 와일드카드 값
사용자 Galaxy를 인용하면
You can use eval to expand the whole line before executing it, e.g. $out=(eval "grep ..."), however, this works only if your input is trusted. –
이렇게 됩니다.
S=1;E=3; LANG=EN eval mkdir -pv "test{$S..$E}/{a,b,c}"
mkdir: created directory 'test1'
mkdir: created directory 'test1/a'
mkdir: created directory 'test1/b'
mkdir: created directory 'test1/c'
mkdir: created directory 'test2'
mkdir: created directory 'test2/a'
mkdir: created directory 'test2/b'
mkdir: created directory 'test2/c'
mkdir: created directory 'test3'
mkdir: created directory 'test3/a'
mkdir: created directory 'test3/b'
mkdir: created directory 'test3/c'
일하다.
답변1
예, Bash에서는 변수가 확장되기 전에 중괄호 확장이 가장 먼저 수행됩니다. 이는 원하는 방식으로 작동하지 않음을 의미합니다.
$ a=1; b=5; echo {$a..$b}
{1..5}
( 주어진 경우 중괄호를 먼저 확장한 {$a..$b}
다음 주어진 변수를 확장합니다 {1..5}
.)
하지만 다음과 같이 할 수 있습니다(용도를 알아낸 경우).
$ aa=123;ab=456; echo $a{a,b}
123 456
Use는 eval
추가 평가를 강제하기 때문에 작동하지만 $
일반적으로 원하는 것이 아닌 기호가 포함된 파일 이름의 명령 확장 및 기타 사항을 평가하기 때문에 일반적으로 좋은 생각이 아닙니다.
아래와 같은 숫자 범위가 있는 경우 루프를 사용할 수 있습니다.
S=1;E=3;
for (( i=$S; i <= $E; i++ )) ; do
echo $i
done
또는:
while [ $S -le $E ] ; do
echo $S
S=$[ $S + 1]
done
또한 zsh
버팀대 확장이 필요한 작업을 수행합니까?
$ zsh -c 'a=1; b=5; echo {$a..$b}'
1 2 3 4 5