(Сценарии наутилуса) $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; есть проблемы с пространством

Итак, скрипт такой:

#!/bin/bash

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

Он хорошо работает и распаковывает файл. Но если файл назван пробелом (например, Leon - 1994.zip), он не будет работать и $line будет

1-й раз: /home/citybong/ Загрузки / Леон

2-й раз: -

3-й раз: 1994.zip

Изменить: я нашел ссылку http://g-scripts.sourceforge.net/faq.php на вопрос: "Мой скрипт не может обрабатывать несколько файлов / файлов с пробелами", но я новичок в сценарии Bash, и я могу не понимаю их решения

4 ответа

Решение

IFS по умолчанию установлен на пробел, поэтому ваша строка делится на пробелы. Просто установите его на новую строку с помощью следующего кода:

IFS_BAK=$IFS
IFS="
"

for line in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
    whatever $line
done

IFS=$IFS_BAK

Вам не нужно связываться с IFS:

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

У меня была похожая проблема, и оказалось, что эхо сохраняет символы новой строки в двойных кавычках, но без кавычек превращает их в пробелы.

С помощью $@ вместо $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS в сценариях Nautilus могут решить проблему с новыми разделителями строк (которые используются в качестве разделителей в $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS а также $NAUTILUS_SCRIPT_SELECTED_URIS).

Итак, код будет выглядеть так:

#!/bin/bash

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

Кроме того, это удобно, когда нам нужно просто передать выбор в другое приложение:

#!/bin/sh

baobab "$@"

Поместите одинарные кавычки вокруг имени переменной, например так:

#!/bin/bash

for line in '$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS'; do
   if [[ "$line" = "" || "$line" = " " ]]; then
      exit
   else
      unzip "$line" -d "temp"
   fi
done
Другие вопросы по тегам