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공백 문자가 포함된 키를 사용할 수 있습니다.

관련 정보