Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование в *nix (http://forum.oszone.net/forumdisplay.php?f=35)
-   -   [решено] имена файлов с пробелами (http://forum.oszone.net/showthread.php?t=309551)

IZOprogman 24-12-2015 02:28 2587901

имена файлов с пробелами
 
Написал скрипт на bash для простой задачи: в цикле по маске перебираются файлы из данной директории, нечто выполняется с ними, а потом текущий файл переименовывается; допустим, f.txt в ~f.old.
Переименование делаю вызовом команды:
Код:

mv $filename.txt ~$filename.old
Это проходит, если в имени файла нет пробелов; если они есть, то команда начинает воспринимать последний "токен" как конечную директорию.
С консоли можно эту операцию закавычить:
Код:

>$ mv "x y.txt" "~x y.old"
- и это проходит. Но в скрипте из-за пробелов в исходном имени она воспринимает опять же новое имя как директорию. А если закавычить первый аргумент, она... воспринимает кавычки как часть имени и не находит такой файл!

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

mar 24-12-2015 16:16 2588027

IZOprogman,
а если так:
Код:

ls -l Рабочий\ стол
т.е. в Вашем случае:
Код:

mv "x\ y.txt" "~x y.old"

El Scorpio 25-12-2015 01:55 2588128

IZOprogman, думаю, что правильно писать так
Код:

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

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

IZOprogman 31-12-2015 00:00 2589986

Ох, а ларчик-то открывался просто!
Оказывается аргументы комангды надо было просто... закавычить!
Код:

mv "$filename.txt" "~$filename.old"
Всем спасибо. :oszone:

kim-aa 20-02-2016 21:29 2608399

Нейл Мэтью Ричард Стоунс
Основы программирования в 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


Время: 04:54.

Время: 04:54.
© OSzone.net 2001-