(Scripts do Nautilus) $ NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; tem problemas com o espaço

4

Então o script é:

#!/bin/bash

for line in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
   if [[ "$line" = "" || "$line" = " " ]]; then
      exit
   else
      unzip "$line" -d "temp"
   fi
done

Funciona bem e descompacta o arquivo. Mas se o arquivo é nomeado com um espaço (por exemplo: Leon - 1994.zip) não vai funcionar e o $line será

1ª vez: / home / citybong / Downloads / Leon

2ª vez: -

3ª vez: 1994.zip

Edit: Eu criei um link link para a pergunta: "Meu script não suporta vários arquivos / arquivos com espaços ", mas eu sou meio novato para bash scripting e não consigo entender suas soluções

    
por Leon Vitanos 14.01.2013 / 15:19

4 respostas

7

Por padrão, o IFS é definido como espaço, é por isso que sua string está sendo dividida em espaços. Basta configurá-lo para a nova linha com o seguinte código:

IFS_BAK=$IFS
IFS="
"

for line in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
    whatever $line
done

IFS=$IFS_BAK
    
por hytromo 14.01.2013 / 15:47
2

Você não precisa mexer no IFS:

echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | while read filename; do
    unzip "$filename" -d temp
done

Eu tive um problema semelhante e acontece que o echo preserva as novas linhas entre aspas duplas, mas sem as aspas as altera para espaços.

    
por Janek37 18.02.2013 / 10:09
0

Usar $@ em vez de $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS nos scripts do Nautilus poderia resolver o problema com novos separadores de linha (que são usados como delimitadores em $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS e $NAUTILUS_SCRIPT_SELECTED_URIS ).

Então, o código será parecido com:

#!/bin/bash

for line in "$@"; do
   if [[ "$line" = "" || "$line" = " " ]]; then
      exit
   else
      unzip "$line" -d "temp"
   fi
done

Além disso, é útil quando precisamos apenas passar a seleção para outro aplicativo:

#!/bin/sh

baobab "$@"
    
por dess 12.07.2015 / 11:39
-1

Coloque aspas simples em volta do nome da variável, assim:

#!/bin/bash

for line in '$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS'; do
   if [[ "$line" = "" || "$line" = " " ]]; then
      exit
   else
      unzip "$line" -d "temp"
   fi
done
    
por Clive van Hilten 14.01.2013 / 15:29