yadまたはzenityを使用して、どのアイテムが空であるかを確認してください。

yadまたはzenityを使用して、どのアイテムが空であるかを確認してください。

4つの項目で構成されるフォームを使用して、4つの要素で構成された配列を作成しようとしています。

new_prop=($(zenity --forms --title="my-script" --text="Insert the values" --separator=" " \
                        --add-entry="Name" \
                        --add-entry="Surname" \
                        --add-entry="Gender" \
                        --add-entry="Age"))

通常、ユーザーはGenderこのフィールドを空白にすることができますが、残りの3つのフィールドは入力する必要があります。

問題は、項目が空の場合は空の要素が生成されず、単にスキップされたことですzenity(わかりません)。たとえば、andをyad挿入すると、2つの要素を持つ配列が作成されます。NameAgezenitynew_prop

フォームのアイテムが空であることを確認するには?フォームが使用またはzenity作成されることは重要ではありませんyad

ありがとうございます!

答え1

問題は、項目が空の場合、zenity(yadについてはわかりません)が空の要素を作成せずに要素をスキップしたことです。たとえば、名前と年齢を挿入すると、zenityは2つの要素を持つnew_prop配列を作成します。

項目が空の場合は空の要素が生成されますが、分割+glob演算子とスペース区切り文字を使用してシェルから出力を分割します。

空白は空白文字であるため、$IFS(基本的に)分割で見つかった場合、先行文字と末尾文字は無視され、1つ以上のIFS空白シーケンスが1つとして処理されます。もちろん、ワイルドカードを要求することは意味がありません。

使用してください(bash 4.4以降がwait "$!"getzenityの終了状態を使用できると仮定):

readarray -t new_prop < <(
  zenity --forms \
         --title="my-script" \
         --text="Insert the values" \
         --separator=$'\n' \
         --add-entry={Name,Surname,Gender,Age}
) && wait "$!"

(値に改行文字を含めることはできないと仮定)

スプリット+グローブを使用するには、空白ではなく区切り文字(最近のbashバージョンではロケールでシングルバイト文字に分類され、以前のバージョンではスペース、タブ、改行のみ)を使用し、もちろん未使用のグローブ部分も無効にする必要があります。欲しくない

zenitybashでIFS分割に必要な区切り文字を使用し、コマンド置換ストリップ末尾の改行文字を使用すると、状況がさらに複雑になります。

IFS=$'\36' # or any non-whitespace character not expected in the values
           # here using ASCII RS (record separator) character.
set -o noglob
new_prop=(
  $(
    set -o pipefail
    zenity --forms \
           --title="my-script" \
           --text="Insert the values" \
           --separator="$IFS" \
           --add-entry={Name,Surname,Gender,Age} |
      sed "\$s/\$/$IFS/"
  )
)

sedbash で IFS 分割の最後の行末に RS を追加すると、そのフィールドが空であってもそのフィールドを表示できます。これはまた、最後のフィールドの末尾の改行がコマンド置換によって除去されることを防止する。

フィールドの改行はもはや問題になりませんが、RS文字は問題になります。

zsh単一文字だけでなく、任意の区切り文字と対応するパラメータs拡張フラグを使用できます。

sep=$'\36@@%%@@\36'
new_prop=(
  "${(@ps[$sep])$(
    zenity --forms \
           --title="my-script" \
           --text="Insert the values" \
           --separator=$sep \
           --add-entry={Name,Surname,Gender,Age})}"
)

(これを行うと、コマンド置換のために最後のフィールド(ある場合)の末尾の改行文字は削除されますが)。


1私のテストでは、コピーして貼り付けるか、他の入力方法(たとえば、zenity一部のシステムではUnicodeコードポイントを介して文字を入力するCtrl++)を使用しているShift場合は、改行を含めることができます。 GUIでは⏎でレンダリングされますが、stdoutでは改行文字として出力されます。ua

関連情報