Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Bash. Интерполяция и параметры с пробелами.  (Прочитано 12981 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 07-02-2010 13:42 » 

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

test.sh (покажет список полученных параметров):
Код:
#!/bin/sh

while [ $# -gt 0 ]
do
    echo "$1"
    shift
done

Тесты:
Код:
$ VAR='aaaa "bbbb cccc" dddd'
$ ./test.sh aaaa "bbbb cccc" dddd
aaaa
bbbb cccc
dddd
$ ./test.sh $VAR
aaaa
"bbbb
cccc"
dddd
$ ./test.sh "$VAR"
aaaa "bbbb cccc" dddd

А хотелось бы получить такое:
Код:
aaaa
bbbb cccc
dddd
Но не задавая непосредственными параметрами (как в первом тесте), а используя переменную.

Какие есть мысли?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-02-2010 14:41 » 

В общем случае ни как, т.к. VAR является строкой которая что то содержит, а ARGV массивом строк:
Код:
ARGV[1]="aaa"
ARGV[2]="aaa bbb"
ARGV[3]="bbb"

VAR='aaa "aaa bbb" bbb'

Используй несколько переменных окружения.
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 07-02-2010 14:43 » 

Хотя переменная окружения BASH_VERSIINFO как раз является массивом строк:
Код:
BASH_VERSINFO=([0]="3" [1]="2" [2]="50" [3]="1" [4]="release" [5]="i486-slackware-linux-gnu")
смотри в этом направлении.
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 07-02-2010 14:48 » 

Но при передаче ее через параметры, передается только одно значение:
Код:
[root@vm-linux ~]# VAR=([0]="aaa" [1]="aaa bbb" [2]="bbb")
[root@vm-linux ~]# ./test.sh "$VAR"
aaa
[root@vm-linux ~]# ./test.sh "${VAR[1]}"
aaa bbb
[root@vm-linux ~]# echo $VAR
aaa
[root@vm-linux ~]# set | grep VAR
VAR=([0]="aaa" [1]="aaa bbb" [2]="bbb")

В принципе, можно эту переменную использовать внутри скрипта.
« Последнее редактирование: 07-02-2010 14:53 от Serg79 » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 07-02-2010 16:28 » 

Serg79, я пока не знаю. Думаю, что метод должен существовать - просто я о нем не знаю: shell существует не один десяток лет, а за такой срок не один я должен был столкнуться с данной проблемой.

С несколькими переменными - об этом я уже думал. Не нравится - не универсально. Тем более, если нужно передать эту переменную в чужой скрипт. Не хотелось бы его модифицировать, т.к. он из дистрибутива и может быть перезаписан при обновлении.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 07-02-2010 16:42 » new

Если ближе к источнику проблемы, то я борюсь с pptp под CentOS: хочу, чтобы соединение запускалось при загрузке системы и управлялось командами ifup и ifdown. Настройки задаю в /etc/sysconfig/network-scripts/ifcfg-ppp0 через $PPPOPTIONS.
Проблемный параметр: pty /usr/sbin/pptp vpnhost --nolaunchpppd ...
Если я выношу его в конфиг, то происходит что-то непонятное при запуске - создается лишний процесс pppd. При запуске pppd из командной строки этого не происходит. Пока не понял, в чем загвоздка.

Пакет pptp-client в CentOS не входит - я взял его на стороне.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines