以下 bash 代码可以很好地通过忽略 xrandr 来获取和回显屏幕的 x 和 y 分辨率:
您可以通过以下方式获取当前屏幕的分辨率:
通过运行获取 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,而无需使用 awk?
答案1
首先,真的没有理由删除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"
请注意,所有这些都假设只连接了一个屏幕,就像您的原始方法一样。
答案2
您可以使用二元运算符和read
:
[[ $(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}
答案3
解析xrandr
输出
在这个答案中我使用纯 bash。所有提出的解决方案都进行 xrandr 输出解析,而无需调用任何外部二进制文件(如awk
、grep
等)。
不要使用 grep 查找星号*
,只需使用 grep 查找connected
行即可:
xrandr --current | grep connected
VGA-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 connected primary 1920x1080+0+120 (normal left inverted right x axis y axis) 531mm x 299mm
DP-2 connected 1920x1200+1920+0 (normal left inverted right x axis y axis) 535mm x 339mm
HDMI-2 disconnected (normal left inverted right x axis y axis)
这显示哪个屏幕已连接以及他的目前的规模:
显示屏幕
scnt=1
while IFS=' x+' read dev stat w h x y j _; do
if [[ $stat == connected ]]; then
typ=sec
[[ $w == primary ]] &&
typ=${w::3} w=$h h=$x x=$y y=$j
printf '%3d: %-8s (%s) width:%5d height:%5d hoffset:%5d voffset:%5d\n' \
$((scnt++)) $dev $typ $w $h $x $y
fi
done < <(xrandr)
1: HDMI-1 (pri) width: 1920 height: 1080 hoffset: 0 voffset: 120
2: DP-2 (sec) width: 1920 height: 1200 hoffset: 1920 voffset: 0
或者完整解析显示和屏幕:
scnt=1
while read -r line; do
case $line in
Screen*)
line=${line#*current }
IFS=' ,' read -r width _ height _ <<< "$line"
printf '%-20swidth:%5d height:%5d\n' Whole\ display: $width $height
;;
*\ connected\ *)
IFS=' x+' read -r dev stat width height offx offy j _ <<< "$line"
typ=sec
[[ $width == primary ]] &&
typ=${width::3} width=$height height=$offx offx=$offy offy=$j
printf '%3d: %-8s (%s) width:%5d height:%5d hoffset:%5d voffset:%5d\n' \
$((scnt++)) $dev $typ $width $height $offx $offy
;;
esac
done < <(xrandr)
这将在我的主机上显示:
Whole display: width: 3840 height: 1200
1: HDMI-1 (pri) width: 1920 height: 1080 hoffset: 0 voffset: 120
1: DP-2 (sec) width: 1920 height: 1200 hoffset: 1920 voffset: 0