【问题标题】:Why zenity color selection piping to sed breaks the code?为什么zenity选色管道送破码?
【发布时间】:2015-06-25 10:53:11
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: shell sed scripting hex zenity


    【解决方案1】:

    之后

    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 调用。

    【讨论】:

    • 是的,效果很好。谢谢。刚接触 shell 脚本,但您的提示可以完成这项工作。 6 位十六进制和你们 rgb 是熟悉的,有很多东西可以转换 em,但 12 位有点奇怪,我认为很多人不习惯这种颜色格式;)
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多