2012-11-26 4 views
2

Еще один раз я написал сценарий для автоматической смены обоев для моей настройки мультимонитора. Я хотел изменить его так, чтобы цвет, который заполняет дополнительное пространство, является средним количеством изображений, но, похоже, он просто убивает скрипт, когда я пытаюсь. Вот что я получил:Сценарий оболочки для обоев со средним цветом фона

#!/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 
+1

Одна заметка о 'RANDOM = ...': в bash и zsh '$ RANDOM' - это специальная переменная, которая не может быть установлена ​​и оценивается случайным числом (т. е. вы никогда не будете получите значение '$$$ (date +% s)' там, но вы получите случайное целочисленное значение). В чистой оболочке POSIX (например, тире) нет массивов ('FILES = ($ 1/*)'), поэтому нет необходимости в определении RANDOM: там, где отсутствует сценарий, не работает. Из-за упомянутой проблемы вы ** не должны ** использовать '/ bin/sh' в shebang, это должно быть'/bin/bash' там, или скрипт будет разбит на систему, где shell используется для '/ bin/sh' не имеет расширений, отличных от POSIX. – ZyX

+0

@ZyX Спасибо, что упомянули об этом. Я изменил его на '/ bin/bash' в скрипте, но теперь я просто использую стандартную' $ RANDOM'. '$$$ (date +% s)' был предложен другом, когда я впервые написал сценарий, поскольку я не знал о '$ RANDOM' в то время. –

ответ

1

Я предполагаю, что вы хотите запустить обращенного в субоболочке, так что вам нужно $() вместо ${}:

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" ") 
+0

Это сделало, спасибо! –

1

Линии 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" ") 

вместо. Вы действительно должны использовать больше цитат! ваш скрипт будет сбой, если в некоторых именах файлов есть пробелы