Wordsplitting que ocorre na variável cotada

3

Estou tentando criar um menu de diálogo com base nos resultados do comando lsblk. Meu objetivo é ler a primeira palavra como o item de menu e as demais palavras como descrição do item de menu.

Por exemplo:

$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,size | grep sda)

Este comando funciona, porque a opção dialog --menu espera dois argumentos por item de menu, neste caso "name" e "size".

No entanto, se eu tentar o mesmo comando com uma descrição de várias palavras (usando o "read" interno para gravar no stdout como duas variáveis), a divisão de palavras ocorrerá na segunda variável, mesmo que seja citada.

#commmand 1: unquoted variable
$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,type,size | grep sda |
> while read name desc; do
> echo $name $desc
> done)                      #results in output like below without quotes

#command 2: quoted variable 
$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,type,size | grep sda |
> while read name desc; do
> echo $name "$desc"
> done)                      #results in output like below without quotes

#command 3: escape quoted variable
$ dialog --menu "Choose one:" 0 0 0 $(lsblk -lno name,type,size | grep sda |
> while read name desc; do
> echo $name \"$desc\"
> done)                      #results in output below

Nãoentendoporqueadivisãodepalavrasestáocorrendonavariávelcitada.Alguémpodeexplicare/ousugerirumasoluçãoalternativa?Eutenteiescreverasaídadolsblkparaumarquivoeleroarquivocomosmesmosresultados.Asaídadesejadaé:

EDIT:Euolhei comando citando como uma solução possível, mas isso resulta na saída do comando lsblk sendo passada para diálogo como um argumento quando dois são necessários.

Obrigado.

    
por slo.sleuth 18.10.2016 / 01:02

1 resposta

1

Você precisa fazer isso em duas partes:

# 1. read the output of lsblk, 2 words per line, into an array
parts=()
while read -r disk data; do 
    parts+=("$disk" "$data")
done < <(lsblk -lno name,type,size | grep sda)

# 2. send the elements of the array to the dialog command
dialog --menu "Choose one:" 0 0 0 "${parts[@]}"

O comando read colocará o primeiro trabalho separado por espaço em branco na variável disk e, em seguida, o restante da linha em data . É muito importante citar todas as variáveis para evitar a divisão de palavras

    
por 18.10.2016 / 23:37