0

我正在尝试使用 sed 将从 zenity 的 --color-selection 对话返回的 12 位十六进制代码转换为 6 位十六进制代码。例如:#dfe251a951a9 到 #df5151。但是一旦我在下面的代码中使用 sed,它就会破坏整个脚本,当我选择“选择”或“取消”按钮时,我没有得到相应的回声!有什么问题?

在使用 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
4

1 回答 1

3

color=$(zenity --color-selection | sed 's/\(#\?..\)../\1/g')

$?sed(not 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调用。

于 2015-06-25T11:01:52.767 回答