Por que este script Bash não está funcionando?

2

Eu escrevi um pequeno script Bash para que a imagem na pasta se torne o papel de parede:

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

O erro é:

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

Meu código está errado? E existe uma maneira de definir papéis de parede da Internet usando um script Bash?

    
por Bharat 31.12.2014 / 20:12

4 respostas

7

Você precisa terminar com um "concluído", como:

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

Mas acho que a melhor maneira de fazer isso é assim:

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

Ok, eu editei o segundo código. Tente com isso.

Se você deseja obter papéis de parede aleatórios da Internet, pode executar este código:

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

Este script mudará o papel de parede a cada 60 segundos.

    
por blkpws 31.12.2014 / 20:19
5

No bash, você finaliza for bloqueia com done , assim:

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

Além disso, put aspas duplas em torno de $f , no caso de alguns nomes de arquivos contiverem espaços.

Note que o que você está tentando alcançar pode ser facilitado com find :

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

Substitua $imageDir pelo caminho da pasta que você deseja pesquisar. Ou, se você quer rodar o comando no diretório local, você pode fazer assim:

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

Agradecemos a Gilles por me lembrar sobre $PWD .

    
por Seth 31.12.2014 / 20:16
4

Adicione a última linha: done .

Além disso, put aspas duplas em torno de $f , no caso de alguns nomes de arquivos contiverem espaços.

Assim, todo o script se torna:

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri "file:$f"
done
    
por Leonid V. Fedorenchik 31.12.2014 / 20:16
4

Primeiro, a sintaxe básica do bash: um loop for termina com a palavra reservada done .

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

Além disso, $f é um caminho relativo - é um nome de arquivo no diretório atual. Mas como feyray comentou que o nome do arquivo não seria significativo fora do contexto. Você precisa fornecer um caminho absoluto. Você pode fazer isso facilmente com a PWD variable , que sempre contém o caminho para o diretório atual. Observe que file:// URLs exigem duas barras para o indicador :// , além de uma barra para o diretório raiz que inicia o caminho, que $PWD inclui.

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

Isso não é tudo. Se algum nome de arquivo contiver um espaço, seu script não funcionará. Para evitar essa armadilha, put aspas duplas em torno de substituições de variáveis (sempre coloque aspas duplas em torno das substituições de variáveis).

for f in *.jpg
do 
    gsettings set org.gnome.desktop.background picture-uri "file://$PWD/$f"
done
    
por Gilles 31.12.2014 / 21:02