将关联数组的回显通过管道传送到 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

但是当我运行这个时,mirrorextend是同一个项目。

有没有办法将其分成两个单独的项目?

要打印多个项目,请执行以下操作:

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允许您使用包含空格字符的键。

相关内容