Bash, параметр с пробелом

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
fuzzy
Сообщения: 175
ОС: WinXP / ArchLinux

Bash, параметр с пробелом

Сообщение fuzzy »

Добрый день.
Нужна помощь знатоков Bash, а то я чего-то туплю... Целиком задачу описывать не буду, т.к. проблема в одном частном месте, опишу на коротеньком примере.
Команда

Код: Выделить всё

touch "aa bb"
создаёт один файл с именем 'aa bb' (пробел естественно успешно экранируется кавычками, но можно было бы сделать и touch aa\ bb).
Но нужно сделать это из скрипта такого вида:

Код: Выделить всё

FILENAME=...
touch $FILENAME
Так вот, вопрос в том - как правильно задать переменную FILENAME?
Если я задаю

Код: Выделить всё

FILENAME="aa\ bb"
touch $FILENAME
или

Код: Выделить всё

FILENAME="\"aa bb\""
touch $FILENAME
то я получаю не один файл 'aa bb', а два файла - aa и bb (хотя в втором случае команда echo показывает, что кавычки остаются где надо...)
Понятно дело, что можно сделать

Код: Выделить всё

touch "$FILENAME"
но я этого сделать не могу, т.к. данная команда на самом деле находится в другом скрипте и менять его очень не хочется.
Буду признателен за совет :)
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Bash, параметр с пробелом

Сообщение Voice »

А если имя так сформировать:

Код: Выделить всё

FILENAME=`echo "aa bb" | sed 's/ /\\ /'`
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
whirlwind
Сообщения: 67

Re: Bash, параметр с пробелом

Сообщение whirlwind »

Код: Выделить всё

sss="aaaa bbbb"
touch "$sss"
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
Аватара пользователя
fuzzy
Сообщения: 175
ОС: WinXP / ArchLinux

Re: Bash, параметр с пробелом

Сообщение fuzzy »

whirlwind писал(а):
14.11.2008 11:13

Код: Выделить всё

sss="aaaa bbbb"
touch "$sss"
whirlwind, я же написал в первом сообщении
Понятно дело, что можно сделать touch "$FILENAME", но я этого сделать не могу, т.к. данная команда на самом деле находится в другом скрипте и менять его очень не хочется.
читайте, пожалуйста, внимательнее. Вопрос именно в том, как задать FILENAME, поэтому я и выделил это жирным.


Voice писал(а):
14.11.2008 11:05
А если имя так сформировать:

Код: Выделить всё

FILENAME=`echo "aa bb" | sed 's/ /\\ /'`
Тоже самое... :( Два файла...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Bash, параметр с пробелом

Сообщение diesel »

Код: Выделить всё

diesel@debian:/tmp$ ./0.sh
diesel@debian:/tmp$ ls -l
total 24
-rwxr-xr-x 1 diesel  diesel    48 2008-11-14 11:00 0.sh
-rw-r--r-- 1    1004    1004    0 2008-11-07 14:41 1
-rw-r--r-- 1 diesel  diesel     0 2008-11-14 11:00 aa bb
......
diesel@debian:/tmp$ cat 0.sh
#!/bin/bash

FILENAME="aa bb"
touch "$FILENAME"



fuzzy писал(а):
14.11.2008 11:23
whirlwind писал(а):
14.11.2008 11:13

Код: Выделить всё

sss="aaaa bbbb"
touch "$sss"
whirlwind, я же написал в первом сообщении
Понятно дело, что можно сделать touch "$FILENAME", но я этого сделать не могу, т.к. данная команда на самом деле находится в другом скрипте и менять его очень не хочется.
читайте, пожалуйста, внимательнее. Вопрос именно в том, как задать FILENAME, поэтому я и выделил это жирным.

ну и что что она находится в другом скрипте?


Код: Выделить всё

diesel@debian:/tmp$ ./1.sh
diesel@debian:/tmp$ ls -la
total 44
drwxrwxrwt  8 root    root    4096 2008-11-14 11:04 .
drwxr-xr-x 25 root    root    4096 2008-11-07 14:41 ..
-rwxr-xr-x  1 diesel  diesel    48 2008-11-14 11:00 0.sh
-rw-r--r--  1    1004    1004    0 2008-11-07 14:41 1
-rwxr-xr-x  1 diesel  diesel    59 2008-11-14 11:04 1.sh
-rw-r--r--  1 diesel  diesel     5 2008-10-30 22:52 file
.....
diesel@debian:/tmp$ cat 1.sh
#!/bin/bash

FILENAME="`ls | grep 'aa bb'`"
rm "$FILENAME"


а если другой скрипт вызывает FILENAME без кавычек - то его нужно поменять, потому что следующий раз столкнетесь с теми же проблемами. или кто-то другой столкнется, не заметит, и будет долго думать.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Bash, параметр с пробелом

Сообщение diesel »

fuzzy писал(а):
14.11.2008 11:23
Voice писал(а):
14.11.2008 11:05
А если имя так сформировать:

Код: Выделить всё

FILENAME=`echo "aa bb" | sed 's/ /\\ /'`
Тоже самое... :( Два файла...

Код: Выделить всё

diesel@debian:/tmp$ ./1.sh
diesel@debian:/tmp$ ls -l
total 28
-rwxr-xr-x 1 diesel  diesel    48 2008-11-14 11:00 0.sh
-rw-r--r-- 1    1004    1004    0 2008-11-07 14:41 1
-rwxr-xr-x 1 diesel  diesel    75 2008-11-14 11:09 1.sh
-rw-r--r-- 1 diesel  diesel     0 2008-11-14 11:09 aa bb
-rw-r--r-- 1 diesel  diesel     5 2008-10-30 22:52 file
......
diesel@debian:/tmp$ cat 1.sh
#!/bin/bash

FILENAME="`echo "aa bb" | sed 's/ /\\ /g'`"
touch "$FILENAME"
Спасибо сказали:
Аватара пользователя
fuzzy
Сообщения: 175
ОС: WinXP / ArchLinux

Re: Bash, параметр с пробелом

Сообщение fuzzy »

diesel писал(а):
14.11.2008 12:02
ну и что что она находится в другом скрипте?
Да дело не в том, что она в другом, а в том, что я не хочу менять этот скрипт по разным причинам (хотя бы потому, что мне потом нужно будет следить, чтобы этот скрипт не поменялся в этом месте опять, а мне лень это делать). Поэтому я хочу задать именно переменную FILENAME, если есть возможность это сделать.

Поэтому просьба ко всем - решения с touch "$FILENAME" предлагать не нужно. И обсуждать тоже. Я этот вариант знаю, но он мне не нравится. Я хочу узнать знает ли кто-либо другое решение. Если да, то буду очень признателен, если поделитесь.
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Bash, параметр с пробелом

Сообщение Voice »

Так же предложенный мной вариант вроди как рабочий...
// Ой, таки не работает.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
ТВЭЛ
Сообщения: 132
ОС: основана на SlackWare
Контактная информация:

Re: Bash, параметр с пробелом

Сообщение ТВЭЛ »

Просто любопытно... а зачем в имени файла пробел?
Время не ждет.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Bash, параметр с пробелом

Сообщение allez »

fuzzy, если вам не нравится конструкция "$FILENAME", специально предназначенная для таких случаев, то выход только один - не использовать пробелы в именах файлов.
Спасибо сказали:
Аватара пользователя
fuzzy
Сообщения: 175
ОС: WinXP / ArchLinux

Re: Bash, параметр с пробелом

Сообщение fuzzy »

ТВЭЛ писал(а):
14.11.2008 13:31
Просто любопытно... а зачем в имени файла пробел?
Да на самом деле это просто пример, для того, чтобы в двух словах объяснить о чём речь. На самом деле там длинная команда, одним из параметров является текстовая строка, которая и должна содержать пробел. Просто механизм одинаковый и чтобы не расписывать кучу ненужной инфы, привёл маленький аналогичный пример, который легко воспроизвести, если у кого-то появятся сомнения в том, что я не прав...

allez писал(а):
14.11.2008 13:31
fuzzy, если вам не нравится конструкция "$FILENAME", специально предназначенная для таких случаев, то выход только один - не использовать пробелы в именах файлов.
Да мне то она нравится... просто не я пишу скрипт, который её содержит. Хочется обойтись решением на своей стороне...
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Bash, параметр с пробелом

Сообщение allez »

В таком случае остается только вправить мозги автору того скрипта...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Bash, параметр с пробелом

Сообщение diesel »

fuzzy писал(а):
14.11.2008 13:34
ТВЭЛ писал(а):
14.11.2008 13:31
Просто любопытно... а зачем в имени файла пробел?
Да на самом деле это просто пример, для того, чтобы в двух словах объяснить о чём речь. На самом деле там длинная команда, одним из параметров является текстовая строка, которая и должна содержать пробел. Просто механизм одинаковый и чтобы не расписывать кучу ненужной инфы, привёл маленький аналогичный пример, который легко воспроизвести, если у кого-то появятся сомнения в том, что я не прав...

может быть вы что-то более близкое к начальной задаче предложите в качестве примера? просто формировать странную переменную для того чтобы ее передать в другом скрипте в качестве единственного параметра - это похоже на очень кривое решение.

fuzzy писал(а):
14.11.2008 13:34
allez писал(а):
14.11.2008 13:31
fuzzy, если вам не нравится конструкция "$FILENAME", специально предназначенная для таких случаев, то выход только один - не использовать пробелы в именах файлов.
Да мне то она нравится... просто не я пишу скрипт, который её содержит. Хочется обойтись решением на своей стороне...

проблема в примере который вы приводите примерно в следующем: сначала интерпретируется содержимое переменной $FILENAME, все bash-подстановки которые могут там быть сделаны - делаются на этом этапе. потом формируется массив входных значений, тот который argv в C, пробелы воспринимаются в качестве разделителя, если при этом сама переменная $FILENAME заключена в кавычки(вернее то что уже было интерпретировано), то они тут срабатывают, если нет - то нет(это очень приблизительно).
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3
Контактная информация:

Re: Bash, параметр с пробелом

Сообщение nesk »

Задачка конечно надуманная. Проще поправить скрипт ( и надавать по рукам тому кто его писал)
в старых версиях bash (когда подстановка переменных шла в другой последовательности) сработал бы такой хак:
FILENAME='. ; touch "aa bb"'
touch $FILENAME
(да и все Ваши трюк с кавычками внутри переменной, думаю тоже бы сработали в старых версиях)
Но эту "дыру" уже давно закрыли

Сейчас есть такое решение (не знаю поможет ли оно Вам и как оно повлияет на другие команды скрипта)

export FILENAME="aa bb"
export IFS=""
touch $FILENAME

удачи.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
fuzzy
Сообщения: 175
ОС: WinXP / ArchLinux

Re: Bash, параметр с пробелом

Сообщение fuzzy »

nesk писал(а):
14.11.2008 16:17
export IFS=""
А не могли бы вы прокомментировать назначение этой строчки?... (я конечно в гугле поищу, но немного позже :) )
Спасибо сказали:
Аватара пользователя
--=Civil696=--
Сообщения: 227
ОС: Gentoo o_O

Re: Bash, параметр с пробелом

Сообщение --=Civil696=-- »

fuzzy писал(а):
14.11.2008 21:09
А не могли бы вы прокомментировать назначение этой строчки?... (я конечно в гугле поищу, но немного позже :) )
ну это вы зря ^^
первая же ссылка:
$IFS

разделитель полей во вводимой строке (IFS -- Internal Field Separator)

Эта переменная управляет порядком выделения полей (задает символы-разделители) при разборе строки символов.

По-умолчанию -- пробельный символ (пробел, табуляция и перевод строки), но может быть изменен, например, для разбора строк, в которых отдельные поля разделены запятыми. Обратите внимание: при составлении содержимого переменной $*, Bash использует первый символ из $IFS для разделения аргументов.
НЕ ПАНИКУЙ © ^_~
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:

Re: Bash, параметр с пробелом

Сообщение diesel »

nesk писал(а):
14.11.2008 16:17
export FILENAME="aa bb"
export IFS=""
touch $FILENAME

но это может убить остальную функциональность скрипта который "скрыт" за touch.
Спасибо сказали:
Ответить