Bash 背景色为平均值的墙纸外壳脚本

Bash 背景色为平均值的墙纸外壳脚本,bash,imagemagick,zsh,wallpaper,Bash,Imagemagick,Zsh,Wallpaper,不久前,我写了一个脚本,用于为我的多显示器设置自动更改壁纸。我想改变它,使填充额外空间的颜色是图像的平均值,但当我尝试时,它似乎扼杀了脚本。以下是我得到的: #!/bin/sh BACKGROUND="-background #452036" GRAVITY="-gravity Center" GRAVITY2="-gravity North" GRAVITY3="-gravity South" LEFT_SIZE=1920x1062 RIGHT_SIZE=1280x958 FINAL_SIZ

不久前,我写了一个脚本,用于为我的多显示器设置自动更改壁纸。我想改变它,使填充额外空间的颜色是图像的平均值,但当我尝试时,它似乎扼杀了脚本。以下是我得到的:

#!/bin/sh

BACKGROUND="-background #452036"
GRAVITY="-gravity Center"
GRAVITY2="-gravity North"
GRAVITY3="-gravity South"
LEFT_SIZE=1920x1062
RIGHT_SIZE=1280x958
FINAL_SIZE=3200x1080

RANDOM=$$$(date +%s)
FILES=($1/*)
NUM_FILES=${#FILES[*]}
LEFT_IMAGE=${FILES[$RANDOM % $NUM_FILES]}
RIGHT_IMAGE=${FILES[$RANDOM % $NUM_FILES]}

LCOLOR=${convert $LEFT_IMAGE -resize 1x1\! -depth 8 txt:- | tail -1 | grep -E -o "#(.)* " | cut -f1 -d" "}
RCOLOR=${convert $RIGHT_IMAGE -resize 1x1\! -depth 8 txt:- | tail -1 | grep -E -o "#(.)* " | cut -f1 -d" "}
LBACKGROUND="-background" $LCOLOR
RBACKGROUND="-background" $RCOLOR


convert $LBACKGROUND $GRAVITY -scale $LEFT_SIZE ${LEFT_IMAGE}\
    -extent $LEFT_SIZE ~/.left.png

convert $RBACKGROUND $GRAVITY -scale $RIGHT_SIZE ${RIGHT_IMAGE}\
    -extent $RIGHT_SIZE ~/.right.png

convert $BACKGROUND $GRAVITY2 +append \
~/.left.png \
~/.right.png \
~/.wpcompo.png

convert $BACKGROUND $GRAVITY3 -extent $FINAL_SIZE ~/.wpcompo.png ~/.wallpaper.png
它返回:

/home/ryan/Scripts/wpconvert.sh: line 17: ${convert ${LEFT_IMAGE} -resize 1x1\! -depth 8 txt:- | tail -1 | grep -E -o "#(.)* " | cut -f1 -d" "}: bad substitution
我假设您希望在子shell中运行convert,因此需要
$()
而不是
${}

LCOLOR=$(convert $LEFT_IMAGE -resize 1x1\! -depth 8 txt:- | tail -1 | grep -E -o "#(.)* " | cut -f1 -d" ")
RCOLOR=$(convert $RIGHT_IMAGE -resize 1x1\! -depth 8 txt:- | tail -1 | grep -E -o "#(.)* " | cut -f1 -d" ")
第17行和第18行:使用

LCOLOR=$(convert $LEFT_IMAGE -resize 1x1\! -depth 8 txt:- | tail -1 | grep -E -o "#(.)* " | cut -f1 -d" ")
RCOLOR=$(convert $RIGHT_IMAGE -resize 1x1\! -depth 8 txt:- | tail -1 | grep -E -o "#(.)* " | cut -f1 -d" ")

相反。你真的应该多加引用!如果某些文件名包含空格,脚本将失败。

关于
RANDOM=…
:在bash和zsh中,
$RANDOM
是一个特殊变量,不能设置并计算为随机数(即,您永远不会在那里获得
$$(date+%s)
的值,但您将获得随机整数值)。在纯POSIX shell(如dash)中,没有数组(
文件=($1/*)
),因此不需要定义RANDOM:如果没有,脚本就无法工作。由于上述问题,您不能在shebang中使用
/bin/sh
,它应该在那里
/bin/bash
,否则脚本将在系统上中断,而用于
/bin/sh
的shell没有非POSIX扩展。@ZyX感谢您提到这一点。我在脚本中将其更改为
/bin/bash
,但现在我只使用标准的
$RANDOM
$$$(date+%s)
是我第一次编写脚本时一位朋友建议的,因为当时我不知道
$RANDOM