我正在尝试使用包含 4 个条目的表单创建一个包含四个元素的数组:
new_prop=($(zenity --forms --title="my-script" --text="Insert the values" --separator=" " \
--add-entry="Name" \
--add-entry="Surname" \
--add-entry="Gender" \
--add-entry="Age"))
一般情况下,用户可以将该Gender
字段留空,但必须填写其他 3 个。
问题是,如果条目留空,zenity
(我不知道)不会创建空元素,而只是跳过该元素。yad
例如,如果我插入Name
and Age
,zenity
则生成一个包含 2 个元素的数组new_prop
。
如何检查表单中的条目是否为空?zenity
表格是用还是制作的并不重要yad
。
谢谢你!
如果条目留空,它确实会创建一个空元素,只是您在 shell 中使用了带有空格分隔符的 split+glob 运算符来拆分其输出。
空格是一个空白字符,因此,当在
$IFS
(默认情况下)找到时,对于拆分部分,前导和尾随的字符将被忽略,一个或多个 IFS 空白的序列被视为一个。当然,要求通配是没有意义的。使用(假设 bash 4.4 或更新版本能够使用
wait "$!"
getzenity
的退出状态):(假设值不能包含换行符¹)
要使用 split+glob,您需要使用非空白的分隔符(单字节字符在最近的 bash 版本中的语言环境中分类为此类,空格,制表符,仅在旧版本中换行符)当然禁用 glob你不想要的部分。
由于
zenity
使用分隔符,这里变得更加复杂,而 bash 中的 IFS 拆分需要定界符和命令替换条尾随换行符。sed
在 bash 的 IFS 拆分的最后一行末尾添加一个 RS 以查看相应的字段,即使它是空的。这也可以防止最后一个字段中的尾随换行符被命令替换删除。现在,字段中的换行符不再是问题,但 RS 字符才是。
在 中
zsh
,您可以使用任意分隔符(不仅仅是单个字符)及其s
参数扩展标志:(尽管由于命令替换,这仍然会删除最后一个字段中的尾随换行符)。
¹ 在我的测试中,
zenity
如果您复制粘贴换行符或使用其他输入法(例如Ctrl+ Shift+)u,则允许您嵌入换行符a
,在某些系统上可以通过它们的 Unicode 代码点输入字符。它们在 GUI 中呈现为 ⏎,但在 stdout 上输出为换行符