Por que o comando cut não divide uma determinada string?

0

O corte funciona como esperado aqui

$ cat test 
1;2;3;4
$ cut -d ';' -f 2 test 
2
$ cut -d ';' -f 3 test 
3

Mas eu esperaria que a saída fosse '21' aqui, o que estou fazendo errado?

$ updates=""
$ echo "$updates" | cat -v

$ updates=$(/usr/lib/update-notifier/apt-check 2>&1);echo $updates
21;0
$ echo "$updates" | cat -v
21;0
$ updates=""
$ updates=$(/usr/lib/update-notifier/apt-check 2>&1);echo $updates | 
cut -d ";" -f 1
21
$ echo "$updates" | cat -v
21;0

Quando eu tento a solução Stéphanes

$ cat test2.sh 
updates=$(/usr/lib/update-notifier/apt-check)
all=${updates%";"*}
security=${updates#*";"}
printf '%s\n' "$all packages can be updated" \
          "$security updates are security updates"
$ ./test2.sh 
21;0 packages can be updated
updates are security updates
    
por sealfab 17.11.2017 / 12:30

1 resposta

4

Para atribuir a saída padrão e o erro padrão de um comando (menos os caracteres de nova linha à direita) a uma variável, a sintaxe nos shells do tipo POSIX é:

updates=$(/usr/lib/update-notifier/apt-check 2>&1)

Para gerar o conteúdo de uma variável com um caractere de nova linha adicionado, a sintaxe é:

printf '%s\n' "$updates"

Para dividir o conteúdo de uma variável em um caractere, a sintaxe é:

IFS=';'
set -o noglob
set -- $updates

printf '%s\n' "First element: $1" "Second element: $2"

Ou você pode fazer:

updates=$(/usr/lib/update-notifier/apt-check 2>&1)
all=${updates%";"*}
security=${updates#*";"}
printf '%s\n' "$all packages can be updated" \
              "$security updates are security updates"

Para obter um equivalente de

/usr/lib/update-notifier/apt-check --human-readable

Você também pode usar cut para obter o primeiro campo delimitado por ponto-e-vírgula de cada linha de uma variável com:

printf '%s\n' "$updates" | cut -d ';' -f 1

Embora se essa variável tiver apenas uma linha, é um pouco exagerado.

    
por 17.11.2017 / 14:32

Tags