Estou tentando criar uma matriz de quatro elementos usando um formulário composto por 4 entradas:
new_prop=($(zenity --forms --title="my-script" --text="Insert the values" --separator=" " \
--add-entry="Name" \
--add-entry="Surname" \
--add-entry="Gender" \
--add-entry="Age"))
Em geral, o usuário pode deixar o Gender
campo vazio, mas os outros 3 devem ser preenchidos.
O problema é que zenity
(não sei yad
) não cria um elemento vazio se uma entrada for deixada em branco, mas simplesmente pula esse elemento. Por exemplo, se eu inserir Name
e Age
, zenity
fizer uma matriz new_prop
de 2 elementos.
Como posso verificar se uma entrada no formulário foi deixada em branco? Não importa se o formulário é feito com zenity
ou yad
.
Obrigado!
Ele cria um elemento vazio se uma entrada for deixada em branco, apenas você usou o operador split+glob com um separador de espaço em branco no shell para dividir sua saída.
O espaço é um caractere de espaço em branco e, como tal, quando encontrado em
$IFS
(como é por padrão), para a parte dividida, os iniciais e finais são ignorados e as sequências de um ou mais espaços em branco IFS são consideradas como um. E, claro, pedir globbing não faz sentido.Use (assumindo o bash 4.4 ou mais recente para poder usar
wait "$!"
para obterzenity
o status de saída do):(assumindo que os valores não podem conter caracteres de nova linha¹)
Para usar split+glob, você precisaria usar um separador que não seja espaço em branco (caracteres de byte único classificados como tal na localidade em versões bash recentes, espaço, tabulação, nova linha apenas em versões mais antigas) e, claro, desabilitar o glob parte que você não quer.
É ainda mais complicado aqui pelo fato de
zenity
usar um separador, enquanto a divisão do IFS no bash espera delimitadores e substituições de comandos que seguem os caracteres de nova linha.sed
adiciona um RS no final da última linha para a divisão IFS do bash para ver um campo correspondente, mesmo que esteja vazio. Isso também evita que novas linhas à direita no último campo sejam removidas pela substituição do comando.Agora, as novas linhas nos campos não são mais um problema, mas os caracteres RS são.
Em
zsh
, você poderia usar separadores arbitrários (não apenas caracteres únicos) com seus
sinalizador de expansão de parâmetro:(embora isso ainda remova os caracteres de nova linha à direita, se houver, do último campo devido à substituição do comando).
¹ em meus testes,
zenity
permite incorporar caracteres de nova linha se você copiá-los e colá-los ou usar outros métodos de entrada como + Ctrl+ Shift, uencontradosa
em alguns sistemas para inserir caracteres por meio de seu ponto de código Unicode. Eles são renderizados como ⏎ na GUI, mas são exibidos como um caractere de nova linha em stdout