Como obter valor em branco na variável no shell script?

1

Eu peguei duas variáveis no comando grep para pesquisar no arquivo. O usuário está apenas colocando um e pressionando enter na segunda variável, o erro é lançado.

Eu quero definir o valor vazio na segunda variável se o usuário não inserir nada para o segundo.

#!/bin/bash 
find /var/log/nginx/ -type f ( -iname "access.log*" ! -iname "access.log*.gz" ) -exec cat {} + >> output.txt 
echo enter the file name read file1 
echo "enter varible 1" 
read var1 
echo "enter varible 2" 
read var2 
grep -w $var1 output.txt | grep $var2 | cut -d' ' -f1,4,12,25 > $file1 
grep -w $var1 output.txt | grep $var2 |sed 's#.*(aff_id=[[:digit:]]\+).*(off_id=[[:digit:]]‌​\+).*(trans_‌​id=[[:alnum:]]\+)‌​;.*#  #' > out2.txt 
paste -d' ' $file1 out2.txt > out3.txt 
rm -rf output.txt 
rm -rf $file1
    
por Rishabh Bahukhandi 13.10.2017 / 11:06

1 resposta

0

Parece que o que você está procurando é a capacidade de testar se uma variável recebeu ou não um valor. Isso pode ser feito usando os operadores de comparação de string Bash. Estes operadores estão documentados em várias referências comuns diferentes, por exemplo:

Em particular, você pode usar o if [ -n "${string}" ] para testar strings não nulas. Adaptar seu script para usar este teste pode resultar em algo como o seguinte:

#!/bin/bash
find /var/log/nginx/ -type f ( -iname "access.log*" ! -iname "access.log*.gz" ) -exec cat {} + >> output.txt
echo enter the file name read file1
echo "enter varible 1"
read var1
echo "enter varible 2"
read var2

if [[ -n "${var2}" ]]; then var2=""; fi

grep -w $var1 output.txt | grep $var2 | cut -d' ' -f1,4,12,25 > $file1
grep -w $var1 output.txt | grep $var2 | sed 's#.*(aff_id=[[:digit:]]\+).*(off_id=[[:digit:]]‌​\+).*(trans_‌​id=[[:alnum:]]\+)‌​;.*#  #' > out2.txt

paste -d' ' $file1 out2.txt > out3.txt
rm -rf output.txt
rm -rf $file1

Dito isso, não acho que isso ajude a resolver seu problema. Para evitar seus erros grep , basta citar as variáveis, por exemplo, %código%. Aqui está o seu script com as variáveis citadas:

#!/bin/bash
find /var/log/nginx/ -type f ( -iname "access.log*" ! -iname "access.log*.gz" ) -exec cat {} + >> output.txt
echo enter the file name read file1
echo "enter varible 1"
read var1
echo "enter varible 2"
read var2

if [[ -n "${var2}" ]];
    var2=""
fi

grep -w "${var1}" output.txt | grep "${var2}" | cut -d' ' -f1,4,12,25 > $file1
grep -w "${var1}" output.txt | grep "${var2}" | sed 's#.*(aff_id=[[:digit:]]\+).*(off_id=[[:digit:]]‌​\+).*(trans_‌​id=[[:alnum:]]\+)‌​;.*#  #' > out2.txt

paste -d' ' $file1 out2.txt > out3.txt
rm -rf output.txt
rm -rf $file1

Uma explicação de por que você precisa citar as variáveis em suas expressões grep -w "${var1}" output.txt pode ser encontrada na Guia do Bash para Iniciantes: Seção 3.4.8 - Divisão do Word :

The shell scans the results of parameter expansion, command substitution, and arithmetic expansion that did not occur within double quotes for word splitting. [...] Explicit null arguments ("""" or "''") are retained. Unquoted implicit null arguments, resulting from the expansion of parameters that have no values, are removed. If a parameter with no value is expanded within double quotes, a null argument results and is retained.

    
por 16.10.2017 / 20:22