Почему этот сценарий Bash не работает?

Я записал маленький сценарий Bash так, чтобы изображение в папке стало обоями:

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri file:$f

Ошибка:

./wall.sh: line 6: syntax error: unexpected end of file

Мой код неправильно? И есть ли способ установить обои из Интернета с помощью сценария Bash?

2
задан 1 January 2015 в 13:58

4 ответа

Необходимо закончить его "сделанным", как:

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri "file:$f"
done

, Но я думаю, что лучший способ сделать это похож на это:

for f in /path/to/dir/*.jpg
do
    gsettings set org.gnome.desktop.background picture-uri "file://$f"
done

Хорошо, я отредактировал второй код. Попробуйте этим.

, Если Вы хотите получить случайные обои от Интернета, можно выполнить этот код:

#!/bin/bash
while true
do 
    img=http://www.wallpaperup.com/wallpapers/download/$RANDOM/1920/1080
    wget -O /tmp/1080.jpg $img
    gsettings set org.gnome.desktop.background picture-uri "file:///tmp/1080.jpg"
    sleep 60
done

Этот сценарий будет изменять обои каждые 60 секунд.

7
ответ дан 19 November 2019 в 00:36

В ударе Вы заканчиваете for блоки done, как так:

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri "file:$f"
done  

кроме того, помещенные двойные кавычки [приблизительно 115] , в случае, если некоторые имена файлов содержат пробелы.

Примечание, что я думаю, чего Вы пытаетесь достигнуть, могло быть сделано легче с find:

find $imageDir -maxdepth 1 -type f -name "*.jpg" -exec gsettings set org.gnome.desktop.background picture-uri file:{} \;  

Замена $imageDir с путем к папке Вы хотите искать. Или, если Вы хотите выполнить команду в локальном каталоге, можно сделать это как это:

find -maxdepth 1 -type f -name "*.jpg" -exec gsettings set org.gnome.desktop.background picture-uri file:$PWD/{} \;   

Спасибо к Gilles для напоминания мне [приблизительно 118].

5
ответ дан 19 November 2019 в 00:36

Добавьте последнюю строку: done.

кроме того, помещенные двойные кавычки [приблизительно 112] , в случае, если некоторые имена файлов содержат пробелы.

Таким образом, целый сценарий становится:

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri "file:$f"
done
4
ответ дан 19 November 2019 в 00:36

Во-первых, основной синтаксис удара: a for цикл заканчивается зарезервированным словом done.

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri file:$f
done

Кроме того, $f относительный путь — это - имя файла в текущем каталоге. Но поскольку feyray отметил, что имя файла не будет значимо из контекста. Необходимо обеспечить полный путь. Можно сделать это легко с PWD переменная, которая всегда содержит путь к текущему каталогу. Отметьте это file:// URL требуют двух наклонных черт для :// индикатор плюс наклонная черта для корневого каталога, который запускает путь, который $PWD включает.

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri file://$PWD/$f
done

Это не все. Если какое-либо имя файла будет содержать пространство, то Ваш сценарий не будет работать. Для предотвращения этой ловушки поместите двойные кавычки вокруг подстановок переменных (всегда помещаемые двойные кавычки вокруг подстановок переменных).

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri "file://$PWD/$f"
done
4
ответ дан 2 December 2019 в 01:25

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

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