为什么zenity颜色选择管道到sed会破坏代码



我正在尝试使用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(而非zenity1的退出状态,为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调用。

相关内容

  • 没有找到相关文章

最新更新