Aspas simples no script bash

0

Eu tenho uma sintaxe de comando como

command 'variable'

A variável deve ser passada entre aspas simples.

Agora, quando eu estou usando um loop for com o arquivo de entrada como

variable1
variable2
variable3
for i in 'cat $1'
do
       command '$i'
done
shell>file.sh input

A aspa simples não está intacta, pois o bash não está considerando a entrada como variável Por favor, sugira como manter a variável intacta com aspas simples

    
por Vishal 30.04.2018 / 11:56

4 respostas

3

Tudo o que estiver entre aspas simples será passado exatamente como você digita. Portanto, command '$i' passará uma string contendo os dois caracteres $ e i para o comando.

Você deve usar aspas duplas para obter o valor da variável usado em seu lugar

for i in 'cat $1'
do
       command "$i"
done

Ou, como seu código espera uma única palavra por linha no seu arquivo, substitua o loop inteiro por essa única linha:

xargs -n1 -r command <"$1"
    
por 30.04.2018 / 13:23
1

Isso pode ser feito conforme solicitado:

while read i
do
       command "'$i'"
done < "$1"
    
por 30.04.2018 / 14:49
1

Se você quiser chamar command para cada linha de um arquivo (cujo caminho é armazenado em $1 ), com o conteúdo da linha passado textualmente como um único argumento para command , você usaria :

  • Com o GNU xargs :

    xargs -d '\n' -n 1 -r -a "$1" command
    
  • Com shells POSIX:

    while IFS= read -r line <&3; do
      command "$line" 3<&-
    done 3< "$1"
    

Seu

for i in 'cat $1'; do
  command '$i'
done

além do problema óbvio de que ele passa uma string literal $i para command tem vários outros problemas:

  • Você esqueceu de citar $1 , o que significa que está sujeito a divisão + glob, o que significa que não funcionará corretamente para caminhos de arquivo que contenham espaços, guias, novas linhas ou caracteres curinga
  • Você esqueceu o -- para marcar o final das opções para cat , o que significa que não funcionará corretamente para os caminhos de arquivo que começam com - . Mesmo com cat -- "$1" , não funcionaria para um arquivo chamado - . cat < "$1" seria melhor. Observe que, se o seu command também aceitar opções, talvez você também precise usar -- ( xargs ... command -- ou command -- "$line" )
  • Esse 'cat $1' chama novamente o operador split + glob. Portanto, ele não está circulando sobre as linhas do arquivo, mas sobre a lista de arquivos que correspondem a cada um dos padrões de glob que resultam da divisão do conteúdo do arquivo.
por 30.04.2018 / 15:31
0

Você poderia usar o comando sem aspas:

for i in 'cat $1'
do
       command $i
done

Com aspas simples '$i' : você recebe literalmente $i .

Com aspas duplas "$i" : você obtém os valores em $i , mas como uma única string (que normalmente é o comportamento desejado).

Sem aspas $i : isso será expandido como o valor em $i , mas os argumentos serão divididos. Então, se você tem um espaço, por exemplo -a -b , com aspas duplas você tem um argumento -a -b que normalmente não é esperado, mas no último caso, você terá -a e -b como dois argumentos diferentes.

Eu devo avisar, que não usar aspas geralmente é um problema de segurança, então você deve fazer isso somente se você realmente souber que as entradas não são maliciosas.

    
por 30.04.2018 / 14:17

Tags