我正在尝试使用sed将zenity的--颜色选择对话框返回的12位十六进制代码转换为6位十六进制码。例如:#dfe251a951a9到#df5151。但一旦我在下面的代码中使用sed,它就会破坏整个脚本,当我选择"选择"或"取消"按钮时,我不会得到相应的echo!怎么了?
在使用sed之前:一切都很好,但我得到了12位十六进制代码
#!/bin/bash
color=$(zenity --color-selection)
if [[ $? == 0 ]]
then
echo "You selected $color."
else [[ $? == 1 ]]
echo "No color selected."
fi
使用sed后:当我点击选择按钮时,我会得到6位十六进制代码,但当我点击取消时,我不会得到"未选择颜色",它会回显"您选择了"。
#!/bin/bash
color=$(zenity --color-selection | sed 's/(#?..)../1/g')
if [[ $? == 0 ]]
then
echo "You selected $color."
else [[ $? == 1 ]]
echo "No color selected."
fi
之后
color=$(zenity --color-selection | sed 's/(#?..)../1/g')
$?
是sed
(而非zenity
)1的退出状态,为0。你可以使用
#!/bin/bash
color=$(zenity --color-selection)
# Now $? is the exit status of zenity
if [[ $? == 0 ]]
then
# Process with sed only if necessary.
color=$(echo "$color" | sed 's/(#?..)../1/g')
echo "You selected $color"
else
echo "No color selected."
fi
注意顺便说一下,我的zenity
(3.16.2)版本不返回十六进制代码,而是返回rgb(12,34,56)
形式的代码。我还没有调查这种变化是何时或为什么发生的,但依赖特定的格式可能并不明智。
1更准确地说:它是$()
派生的子shell的退出状态,它只是转发它运行的最后一个命令的退出状态:sed
调用。