Почему этот скрипт 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?

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

3 ответа

В bash вы заканчиваете for блоки с помощью done, например:

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

Кроме того, добавьте двойные кавычки вокруг $f, если некоторые имена файлов содержат пробелы.

Обратите внимание, что я думаю, что с помощью 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/{} \;   

Спасибо поместите двойные кавычки вокруг $f , чтобы напомнить мне о [ f9].

5
ответ дан 24 May 2018 в 00:32

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

Также добавьте двойные кавычки вокруг $f, если некоторые имена файлов содержат пробелы.

Таким образом, весь скрипт становится :

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri "file:$f"
done
4
ответ дан 24 May 2018 в 00:32

Сначала базовый синтаксис bash: цикл for заканчивается зарезервированным словом done.

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

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

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

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

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri "file://$PWD/$f"
done
4
ответ дан 24 May 2018 в 00:32
  • 1
    Фактически использование двух косых черт на file: не является , строго , gsettings будет принимать его просто отлично, хотя, возможно, это лучше. – Seth♦ 1 January 2015 в 00:14

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

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