0

sed を使用して、zenity の --color-selection ダイアログから返された 12 桁の 16 進数コードを 6 桁の 16 進数コードに変換しようとしています。例: #dfe251a951a9 から #df5151。しかし、次のコードで sed を使用するとすぐにスクリプト全体が壊れ、「選択」または「キャンセル」ボタンを選択すると、それぞれのエコーが得られません! どうしたの?

sed を使用する前: すべて正常に動作しますが、12 桁の 16 進数コードが表示されます。

#!/bin/bash
color=$(zenity --color-selection)
if [[ $? == 0 ]]
then 
    echo "You selected $color."
else [[ $? == 1 ]]
    echo "No color selected."
fi

sedを使用した後:選択ボタンを押すと6桁の16進コードが表示されますが、キャンセルを押すと「色が選択されていません」と表示されず、「選択しました」と表示されます。

#!/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) の私のバージョンは 16 進コードではなく、何かの形式を返すことに注意rgb(12,34,56)してください。この変更がいつ、なぜ起こったのかは調査していませんが、特定の形式に依存するのは賢明ではないかもしれません。

1より正確には、これは、によって生成されたサブシェル$()の終了ステータスであり、実行した最後のコマンドの終了ステータスを転送するだけです:sed呼び出し.

于 2015-06-25T11:01:52.767 に答える