Não é possível ecoar valor da variável = * no script [duplicado]

0

Conteúdo do meu arquivo:

123  
**1    
**  

Script que tenta exibir cada palavra:

for i in $(cat $myfile)  
do  
  echo "$i"  
done  

o resultado é quando echo * , lista os arquivos em meu diretório atual que eu não sei porque. Então eu tentei processar o * antes de fazer o eco.

Conteúdo de outro script:

for i in $(cat $myfile)  
do  
  if [[ $i == *\+ ]](regex pattern find 1 * or more.)  
  then  
       (?what should I do. I tried i="\*",i="*" etc.; it doesn't work)  
  fi  
  echo "$i"  
done
    
por kelvin .C 29.01.2018 / 06:06

3 respostas

3

O nome do arquivo globbing acontece na for -line, com a expansão de $(cat $myfile) , não na echo .

Ao fazer o loop sobre o conteúdo de um arquivo, use read :

while IFS= read -r words; do
    printf '%s\n' "$words"
done <"$myfile"

Veja também:

Se você quiser ter cada palavra separada por espaço em branco em sua própria linha de saída:

awk '{ for (i = 1; i <= NF; ++i) print $i }' "$myfile"
    
por 29.01.2018 / 07:38
3

A resposta certa é: não use um loop de shell para processar o texto. Mas, se você quiser uma solução rápida,

set -o noglob
for i in $(cat $myfile)
do
    echo "$i"
done
set +o noglob

A opção noglob impede a expansão do nome do caminho, então você pode dizer echo * e obter um * em vez de uma lista de arquivos.

    
por 29.01.2018 / 07:30
-1

Você está realmente fazendo duas perguntas, mas ambas falam como o shell trata o caractere * . Esse caractere tem um significado especial para o shell e, como você descobriu, ele age como uma forma particular de expressão regular conhecida nas páginas do shell man como um glob para nomes de arquivos. É por isso que você tem a lista de nomes de arquivos em seu diretório atual, é suposto para isso. Consulte a seção da página do manual do shell no globbing para obter uma descrição detalhada de todas as formas desse tipo específico de sintaxe de expressão regular.

A segunda parte da questão parece estar perguntando como evitar que isso aconteça. Existem duas maneiras. Ou escape o caractere precedendo-o com uma barra invertida \ , ou coloque-o entre aspas simples, ie. '*' .

    
por 29.01.2018 / 06:14