LINUX.ORG.RU

[POSIX Shell] Массивы? Как засунуть в переменную список аргументов программы с пробелами?


0

1

Нужно сделать что-то такое:

#!/bin/sh

DATA_DIR="/var/lib/блаблабла"
PROGRAM="/usr/bin/прога"
PROGRAM_ARGS="--data-dir $DATA_DIR --enable-чтонибудь"

$PROGRAM $PROGRAM_ARGS

Как сделать, чтобы это работало, если в DATA_DIR есть пробелы? Вообще, как оно делается правильно?

>Как сделать, чтобы это работало, если в DATA_DIR есть пробелы?

Заэкранировать пробелы обратными слэшами

madgnu ★★★★★
()
Ответ на: комментарий от madgnu

Заэкранировать пробелы обратными слэшами

anonymous@localhost ~ $ DATA_DIR="path\ with\ spaces"
anonymous@localhost ~ $ ARGS="-l $DATA_DIR"
anonymous@localhost ~ $ ls $ARGS
ls: cannot access path\: No such file or directory
ls: cannot access with\: No such file or directory
ls: cannot access spaces: No such file or directory

Кстати, а почему слеши не работают как экранирующие символы? Вообще теперь не понимаю логику этого шелла.

vasilenko ★★
() автор топика
Ответ на: комментарий от guilder

DATA_DIR='«/var/bla bla bla»'

Очевидно, не работает.

anonymous@localhost ~ $ DATA_DIR="path with spaces"
anonymous@localhost ~ $ ARGS="-l $DATA_DIR"
anonymous@localhost ~ $ ls $ARGS
ls: cannot access path: No such file or directory
ls: cannot access with: No such file or directory
ls: cannot access spaces: No such file or directory
vasilenko ★★
() автор топика
Ответ на: комментарий от vasilenko

посмотрите внимательно на то что я написал у меня ковычки сначало одинрные потом двойные и то что написали вы

guilder
()
Ответ на: комментарий от geekless

a=(-l -h «path with spaces»)

Такие башизмы в POSIX-шелле не канают.

$ dash
$ $ a=(-l -h "path with spaces")
dash: Syntax error: "(" unexpected
vasilenko ★★
() автор топика
Ответ на: комментарий от guilder

посмотрите внимательно на то что я написал у меня ковычки сначало одинрные потом двойные и то что написали вы

А вот фиг. :3

anonymous@localhost ~ $ DATA_DIR='"/var/bla bla bla"'
anonymous@localhost ~ $ ARGS="-l $DATA_DIR"
anonymous@localhost ~ $ ls $ARGS
ls: cannot access "/var/bla: No such file or directory
ls: cannot access bla: No such file or directory
ls: cannot access bla": No such file or directory
vasilenko ★★
() автор топика
Ответ на: комментарий от vasilenko

Разнеси параметры и путь по разным переменным

~ % DATA_DIR="path with spaces"
~ % OPTS="-l"
~ % ls "$OPTS" "$DATA_DIR"
ls: cannot access path with spaces: No such file or directory
GotF ★★★★★
()
Ответ на: комментарий от GotF

Увы, не пойдёт, опции там могут быть любые, на каждую по переменной не напасёшся.

vasilenko ★★
() автор топика

Ну вы блин даёте.

Вариант 1, черезж. Нет, eval - не черезж, а вот постановка задачи - вполне.

DATA_DIR="/var/lib/блаблабла"
PROGRAM="/usr/bin/прога"
PROGRAM_ARGS="--data-dir \"$DATA_DIR\" --enable-чтонибудь"

eval $PROGRAM $PROGRAM_ARGS

Вариант 2, черезруки

DATA_DIR="/var/lib/блаблабла"
PROGRAM="/usr/bin/прога"
PROGRAM_ARGS=" --enable-чтонибудь"

$PROGRAM --data-dir "$DATA_DIR" $PROGRAM_ARGS
router ★★★★★
()
Ответ на: комментарий от vasilenko

>Лол, надо было тему назвать «POSIX SHELL СОСНУЛ!!!».

Лол, надо было тему назвать «быдлокодер не осилил постановку задачи и пытается всё свалить на POSIX SHELL»

router ★★★★★
()

Можно попробовать set и «$@».

const86 ★★★★★
()
#!/bin/sh

DATA_DIR="path with spaces"
PROGRAM="ls"
PROGRAM_ARGS="-l^$DATA_DIR^-a"

OIFS=$IFS
IFS="^"
$PROGRAM $PROGRAM_ARGS
IFS=$OIFS

Но так возникнут проблемы, если в путях есть ^.

ptomaine
()
Ответ на: комментарий от ptomaine

Но так возникнут проблемы, если в путях есть ^.

Вместо «^» лучше взять «\n».

OIFS=$IFS
IFS='
'
#
#твой код
#
#
IFS=OIFS

ipc
()
#!/bin/sh

DATA_DIR="/var/lib/бла бла бла"
PROGRAM="/usr/bin/про га"
PROGRAM_ARGS="--data-dir '$DATA_DIR' --enable-чтонибудь"

eval '$PROGRAM' $PROGRAM_ARGS
xydo ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.