변수를 사용할 때 중괄호 확장이 포함된 mkdir이 실패하는 것 같습니다.

변수를 사용할 때 중괄호 확장이 포함된 mkdir이 실패하는 것 같습니다.

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

관련 정보