O que o corte retorna se o campo especificado não existir?

3

Eu tenho uma string:

6.40.4

e um segundo:

6.40

Estou usando var=$(echo $versionfull | cut -d'.' -f3) para obter o terceiro dígito da primeira string no bash. O que esse comando retorna para o segundo? Parece vazio, mas [ -z $var ] ou [ $var == "" ] não funciona. Eu quero dar um valor de 0 no caso de uma segunda string.

    
por Kliwer 29.08.2018 / 21:17

4 respostas

8

Você pode usar var=$(echo "${versionfull}.0" | cut -d'.' -f3) .

No primeiro caso, versionfull conterá 6.40.4.0, ignorando o preenchimento e retornando 4 conforme necessário. No segundo caso, o .0 será preenchido e retornado.

    
por 29.08.2018 / 21:26
10

Para responder à sua pergunta direta, cut não retorna nada, exceto uma nova linha, conforme a especificação (graças a don_crissti para essa referência):

echo "$versionfull" | cut -d. -f3 | od -c
0000000  \n
0000001

Se você tem um shell que suporta here-strings, você pode fazer o seguinte:

IFS=. read a b c <<< "$versionfull"

Observe a citação de $versionfull , caso já tenha espaço em branco (qualquer coisa de $IFS ).

Se você acha que c pode estar vazio, peça para defini-lo como zero:

c=${c:-0}
    
por 29.08.2018 / 21:27
6

cut tem uma API ímpar.

cut -f n produzirá o campo n th de cada linha que tenha pelo menos um delimitador (vazio se a linha tiver menos de n-1 delimitadores (menos de n campos)) e retorna a linha completa (então o campo primeiro ) para aqueles que não têm nenhum delimitador:

$ echo a.b.c | cut -d. -f3
c
$ echo a.b | cut -d. -f3

$ echo a | cut -d. -f3
a

Portanto, a resposta para O que o corte retorna se o campo especificado não existir? é o primeiro campo ou um campo vazio dependendo se a linha de entrada possui um ou mais campos.

Você pode adicionar a opção -s para remover as linhas que não têm delimitador para evitar o último caso estranho acima, mas geralmente não é o que você quer (geralmente você quer considerar que a linha de entrada tenha um campo 3 rd em branco, em vez de ignorá-la completamente, e isso vale a pena se você quiser o primeiro campo:

$ echo a | cut -sd. -f2
$ echo a | cut -sd. -f1
$

(você solicitou o primeiro campo, a entrada tem apenas um campo, mas você não obtém nenhuma saída porque a entrada não possui um delimitador).

Então, a sugestão do @ ThoriumBR para adicionar um .0 é muito boa. Sem isso:

versionfull=5
echo "$versionfull" | cut -d. -f3

na verdade produziria 5. Adicionando .0 , asseguramos que a entrada tenha pelo menos um delimitador. Eu iria mais longe e usaria:

echo "$versionfull.0.0" | cut -d. -f3

Para garantir que a entrada tenha pelo menos 3 campos.

    
por 29.08.2018 / 22:02
1

Configura para uma string vazia. Você deve citar a variável ao usá-la com o comando [ .

if [ "$var" == "" ]
then echo "Var is empty"
fi

Sem as aspas, a primeira linha se expande para:

if [ == "" ]

que é uma sintaxe inválida porque == requer um parâmetro à esquerda.

    
por 30.08.2018 / 01:03