PDA

Показать полную графическую версию : [решено] имена файлов с пробелами


IZOprogman
24-12-2015, 02:28
Написал скрипт на bash для простой задачи: в цикле по маске перебираются файлы из данной директории, нечто выполняется с ними, а потом текущий файл переименовывается; допустим, f.txt в ~f.old.
Переименование делаю вызовом команды:
mv $filename.txt ~$filename.old
Это проходит, если в имени файла нет пробелов; если они есть, то команда начинает воспринимать последний "токен" как конечную директорию.
С консоли можно эту операцию закавычить:
>$ mv "x y.txt" "~x y.old"
- и это проходит. Но в скрипте из-за пробелов в исходном имени она воспринимает опять же новое имя как директорию. А если закавычить первый аргумент, она... воспринимает кавычки как часть имени и не находит такой файл!

Как правильно написать?

mar
24-12-2015, 16:16
IZOprogman,
а если так:
ls -l Рабочий\ стол
т.е. в Вашем случае:
mv "x\ y.txt" "~x y.old"

El Scorpio
25-12-2015, 01:55
IZOprogman, думаю, что правильно писать так
mv ""\$oldfile\"" ""\$newfile\""

Если вы в тексте скрипта просто напишете двойные кавычки, тогда BASH воспримет это как строковое значение с вложенной переменной, и при выполнении скрипта он преобразует переменную в имя файла без кавычек, и у вас будут проблемы с пробелами

Если же вы в тексте скрипта экранируете кавычки, тогда при выполнении скрипта BASH преобразует \" в нормальные кавычки и в результате преобразует переменную в имя файла, обозначенное кавычками, что устранит все возможные проблемы с пробелами.

IZOprogman
31-12-2015, 00:00
Ох, а ларчик-то открывался просто!
Оказывается аргументы комангды надо было просто... закавычить!
mv "$filename.txt" "~$filename.old"
Всем спасибо. :oszone:

kim-aa
20-02-2016, 21:29
Нейл Мэтью Ричард Стоунс
Основы программирования в Linux

стр. 48

Заключение в кавычки
Прежде чем двигаться дальше, вам следует уяснить одно правило командной оболочки: использование кавычек.
Обычно параметры в сценариях отделяются неотображаемыми символами или знаками форматирования (например, пробелом, знаком табуляции или символом перехода на новую строку).
Если вы хотите, чтобы параметр содержал один или несколько неотображаемых символов, его следует заключить в кавычки.
Поведение переменных, таких как $foo, заключенных в кавычки, зависит от вида используемых кавычек. Если вы заключаете в двойные кавычки $-представление переменной, оно во время выполнения командной строки заменяется значением
переменной.
Если вы заключаете его в одинарные кавычки или апострофы, никакой замены не происходит. Вы также можете отменить специальное назначение символа $, вставив перед ним символ \ (обратный слэш).
Выполним упражнение 2.1.

Упражнение 2.1. Игра с переменными
В этом упражнении показано, как кавычки влияют на вывод переменной:
#!/bin/sh
myvar="Hi there"
echo $myvar
echo "$myvar"
echo '$myvar'
echo \$myvar

echo Enter some text
read myvar
echo '$myvar' now equals $myvar
exit 0




© OSzone.net 2001-2012