Armazenando a saída do comando na variável shell [duplicada]

21

Eu tenho uma operação usando cut que eu gostaria de atribuir o resultado a uma variável

var4=echo ztemp.xml |cut -f1 -d '.'

Eu recebo o erro:

ztemp.xml is not a command

O valor de var4 nunca é atribuído; Estou tentando atribuir a saída de:

echo ztemp.xml | cut -f1 -d '.'

Como posso fazer isso?

    
por Vass 06.12.2010 / 15:57

4 respostas

31

Você vai querer modificar sua tarefa para ler:

var4="$(echo ztemp.xml | cut -f1 -d '.')"

A construção $(…) é conhecida como comando susbtitution .

    
por 06.12.2010 / 16:06
8

Dependendo do shell que você está usando, você pode usar a Expansão de Parâmetros. Por exemplo, em bash :

   ${parameter%word}
   ${parameter%%word}
          Remove matching suffix pattern.  The word is expanded to produce
          a pattern just as in pathname expansion.  If the pattern matches
          a trailing portion of the expanded value of parameter, then  the
          result  of the expansion is the expanded value of parameter with
          the shortest matching pattern (the ''%'' case)  or  the  longest
          matching  pattern  (the ''%%'' case) deleted.  If parameter is @
          or *, the pattern removal operation is  applied  to  each  posi‐
          tional  parameter  in  turn,  and the expansion is the resultant
          list.  If parameter is an array variable subscripted with  @  or
          *,  the  pattern  removal operation is applied to each member of
          the array in turn, and the expansion is the resultant list.

No seu caso, isso significaria fazer algo assim:

var4=ztemp.xml
var4=${var4%.*}

Observe que o caractere # se comporta de maneira semelhante na parte do prefixo da string.

    
por 06.12.2010 / 23:05
7

Ksh, Zsh e Bash oferecem outra sintaxe, talvez mais clara:

var4=$(echo ztemp.xml | cut -f1 -d '.')

Os backticks (ak.a. "grave acento") são ilegíveis em algumas fontes. A sintaxe $(blahblah) é muito mais óbvia, pelo menos.

Observe que você pode canalizar valores para um comando read em alguns shells:

ls -1 \*.\* | cut -f1 -d'.' | while read VAR4; do echo $VAR4; done
    
por 06.12.2010 / 23:03
2

Esta é mais uma maneira de atribuir uma variável, boa de usar com alguns editores de texto que não conseguem realçar corretamente todos os códigos complexos que você criou.

read -r -d '' str < <(cat somefile.txt)
echo "${#str}"
echo "$str"
    
por 10.05.2015 / 23:47