Quando salvo uma saída de comando que contém várias linhas em uma variável diretamente no meu terminal, tenho os seguintes resultados:
$ dirs=$(ls -1d /mnt/*/)
$ echo $dirs
/mnt/ext4/ /mnt/local/ /mnt/remote/ /mnt/test/
$ echo "$dirs"
/mnt/ext4/
/mnt/local/
/mnt/remote/
/mnt/test/
No entanto, ao usá-lo a partir de um script de shell posix, o resultado é diferente. aqui está o roteiro
#!/bin/sh
dirs=$(ls -1d $1)
echo "inline"
echo $dirs
echo "multiline"
echo "$dirs"
E aqui está a saída do script
$ ./test.sh /mnt/*/
inline
/mnt/ext4/
multiline
/mnt/ext4/
Isso acontece mesmo se eu usar bash em vez de sh.
Alguém sabe como eu poderia salvar a saída ls -1d /mnt/*/
em uma variável mantendo a saída completa?
Gostaria de analisar cada um dos quatro caminhos de diretório dentro de um loop for.
O glob aqui se expande para os nomes dos diretórios como argumentos separados, como se você os escrevesse manualmente na linha de comando:
No entanto, no próprio script, você se refere apenas ao primeiro argumento
$1
:Se você quiser se referir a todos os argumentos, use
"$@"
(com as aspas).No entanto, tudo o que você está fazendo com os nomes de diretório aqui é executá
ls
-los, o que apenas imprime os mesmos nomes (embora em linhas separadas). Portanto, se você deseja apenas a lista de argumentos como uma string, não precisa executar ols
comando, basta atribuirdirs="$@"
.No entanto, na maioria, se não em todos os casos, é melhor apenas manter a lista de nomes de arquivos nos parâmetros posicionais e percorrê-los com
ou
Observe que os nomes de arquivo podem conter espaços em branco e, ao concatenar os nomes em uma única string, você perde o significado do espaço em branco dentro dos nomes.
foo bar doo
podem ser três arquivos ou os dois arquivosfoo bar
edoo
.