(Сценарии наутилуса) $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