mkdir com expansão de chave parece falhar quando variáveis são usadas [duplicado]

0

Ubuntu 14.04.5 LTS GNU bash, Versão 4.3.11 (1) -release (x86_64-pc-linux-gnu)

mkdir -vp test{1..3}/{a,b,c}

funciona bem

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'

parece não funcionar.

sem sucesso foi o single e double qouting também.

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}'

Eu sei que posso usar loops for, ter limites com a quantidade de argumentos, possíveis problemas com pastas ou usar printf ou configurações similares, como mostrado nas partes "Perguntas similares".

No entanto, eu prefiro saber por que esse caso específico de globbing falha para mim.

encontrei uma possível solução em um comentário sobre essa questão

Parâmetro de aspas simples do script Bash com valor de globbing

qouting the user galaxy %código% o que faz isso

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'

trabalho.

    
por Dennis Nolte 06.10.2016 / 13:58

1 resposta

0

Sim, no Bash, a expansão de chaves é feita como a primeira coisa, antes de expandir as variáveis. O que significa que isso não funciona como você deseja:

$ a=1; b=5; echo {$a..$b}
{1..5}

(As chaves são expandidas primeiro, dando {$a..$b} , depois as variáveis, dando {1..5} .)

Mas você pode fazer isso (se você já tiver um uso para isso):

$ aa=123;ab=456; echo $a{a,b}
123 456

A utilização de eval funciona, uma vez que força um passe de avaliação adicional, mas geralmente não é uma boa ideia, uma vez que irá avaliar, e. comanda expansões e outras de nomes de arquivos contendo $ sinais, o que geralmente não é o que você quer.

Se você tem um intervalo numérico, como aqui, você pode usar um loop:

S=1;E=3;
for (( i=$S; i <= $E; i++ )) ; do 
     echo $i
done

ou:

while [ $S -le $E ] ; do 
    echo $S 
    S=$[ $S + 1] 
done 

Além disso, zsh faz a expansão de suporte conforme desejado:

$ zsh -c 'a=1; b=5; echo {$a..$b}'
1 2 3 4 5
    
por 06.10.2016 / 14:57