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.
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.
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}
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.
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.
Tags text-processing cut