Как изменить код bash, чтобы сохранить разрешение экрана в ubuntu с помощью xrandr, но без использования awk?

Следующий код bash хорошо работает, чтобы получить и отобразить разрешение экрана x и y, не видя xrandr:

Вы можете получить текущее разрешение экрана следующим образом:

Получить разрешение X запустив:

X=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f1)

Получите разрешение Y, запустив:

Y=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f2)

Выведите разрешение X и Y, запустив:

echo "$X"x"$Y"

или

echo "$X"
echo "$Y"

Как изменить этот код, чтобы получить разрешение экрана в ubuntu, все еще не видя xrandr, a без использования awk?

0
задан 12 July 2021 в 02:51

2 ответа

Во-первых, действительно нет причин удалять awk . Он очень быстрый, стабильный и предназначен для подобных задач. Однако ваша команда излишне сложна. Вы можете просто:

$ xrandr --current | awk '$2~/\*/{print $1}' 
2560x1440

Если вам действительно нужны x и y по отдельности, выполните:

x=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f1)
y=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f2)
echo "$x"
echo "$y"

Или, проще:

$ read x y < <(xrandr --current | awk '$2~/\*/{sub(/x/," ");print $1,$2}')
$ echo "x:$x y:$y"
x:2560 y:1440

И если вы настаиваете на том, чтобы не использовать awk, вот еще несколько вариантов:

read x y < <(xrandr --current | sed -En '/\*/{s/^ *([0-9]+)x([0-9]+).*/\1 \2/p}')
echo "$x"
echo "$y"

или

read x y < <(xrandr --current | perl -lne 'print "$1 $2" if /^ *([0-9]+)x([0-9]+).*/')
echo "$x"
echo "$y"

или

read x y < <(xrandr --current | grep -oP '\d+x\d+' | tr x ' ')
echo "$x"
echo "$y"

Обратите внимание, что все они предполагают, что подключен только один экран, как и ваш исходный подход.

4
ответ дан 28 July 2021 в 11:20

Вы можете использовать бинарный оператор и читать :

[[ $(xrandr --current) \
    =~ current\ ([0-9]+)\ x\ ([0-9]+) \
]] && read x y <<< "${BASH_REMATCH[@]:1:2}"

echo ${x}x${y}

Второй вариант создает список шагов с текущими режимами.

#!/bin/bash

a=()
while read -r; do
    [[ $REPLY \
    =~ \ +([0-9]+)x([0-9]+)\ +[0-9.]+\* ]] && a+=(${BASH_REMATCH[@]:1:2})
done < <(xrandr --current)

# print the first resolution.
read x y <<< ${a[@]::2} && echo ${x}x${y}
2
ответ дан 28 July 2021 в 11:20

Другие вопросы по тегам:

Похожие вопросы: