dmenuへの連想配列のパイプエコー

dmenuへの連想配列のパイプエコー

このスクリプトがあります。

#!/bin/bash

declare -a arr
arr+=(
[mirror]="xrandr --output hdmi-1 --same-as edp-1"
[extend]="xrandr --output hdmi-1 --auto"
)
screen=hdmi-1

chosen=$(echo -e ${!arr[@]}| dmenu -fn monospace-14)

[ "$chosen" != "" ] || exit

しかし、これを実行するとのmirrorようextendなプロジェクトになります。

これを2つの別々のプロジェクトに分割する方法はありますか?

複数の項目を印刷するには:

echo -e "first\nsecond\nthird" | dmenu

この方法では、オプションを一度だけ作成し、オプションを追加するのは非常に簡単なので、連想配列を使用しました(リストを追加するだけです)。

答え1

改行で区切られた入力形式を指定するprintf代わりに、以下を使用します。echo

#!/bin/bash

declare -A arr
arr+=(
[mirror]="xrandr --output hdmi-1 --same-as edp-1"
[extend]="xrandr --output hdmi-1 --auto"
)

choice=$(printf "%s\n" "${!arr[@]}" | dmenu -fn monospace-14)

# Execute choice if dmenu returns ok:
[ $? = 0 ] && ${arr[$choice]}

これはdeclare -a連想配列ではなくインデックス配列でのみ機能しますdeclare -A。パラメータの周囲に引用符を使用すると、空白printf文字を含むキーを使用できます。

関連情報