Переменная, содержащая несколько аргументов с кавычками в Bash - PullRequest
31 голосов
/ 17 сентября 2011

Я генерирую переменную bash, содержащую все мои аргументы, и эти аргументы содержат пробелы.Когда я запускаю команду с этими аргументами - например.ls $ args - кавычки не правильно интерпретируются.Вот пример - также создание и стирание необходимых файлов.

#!/bin/bash
f1="file n1"
f2="file n2"
# create files
touch "$f1" "$f2"
# concatenate arguments
args="\"$f1\" \"$f2\""
# Print arguments, then launch 'ls' command
echo "arguments :" $args
ls $args
# delete files
rm "$f1" "$f2"

При этом у меня появляются некоторые ошибки "нет такого файла" для "файла , n1" , "файл и n2"

Ответы [ 5 ]

51 голосов
/ 17 сентября 2011

Вы можете использовать массив для аргументов, что-то вроде этого:

args=( "$f1" "$f2" )
ls "${args[@]}"

(Проблема, с которой вы столкнулись в данный момент, состоит в том, что после интерполяции нет разницы между пробелами внутри и между именами файлов.)

31 голосов
/ 16 января 2014

Использовать eval это сначала оценит любые расширения и кавычки, а затем выполнит результирующую строку, как если бы она была введена в оболочку.

args="'$f1' '$f2'"
eval ls $args

eval будет тогда выполнять ls 'file n1' 'file n2'

Возникла очень похожая проблема, при попытке передать аргументы в переменных из /etc/default/ до start_stop_daemon в сценариях инициализации.

5 голосов
/ 17 сентября 2011

Используйте set, чтобы установить свои переменные в качестве позиционных параметров; тогда кавычки будут сохранены, если вы обращаетесь к ним через "$@" или "$1", "$2" и т. д. Обязательно используйте двойные кавычки вокруг имен переменных.

set -- "$f1" "$f2"
touch "$@"
ls "$@"
rm "$@"
4 голосов
/ 09 февраля 2012

Это, вероятно, худший ответ, но вы можете изменить IFS .Это «внутренний разделитель полей» и по умолчанию он равен пробелу + табуляции + переводу строки.

#!/bin/sh
IFS=,
MAR="-n,my file"
cat $MAR

Приведенный выше скрипт будет работать catПервый аргумент будет -n (пронумерованные строки), а второй аргумент будет my file.

0 голосов
/ 04 января 2016

Вот мой рецепт для объединения аргументов в кавычках - в основном используется для обеспечения читабельности сценария.Но также удобно легко комментировать некоторые аргументы:

PARAM1="a param with white spaces"
PARAM2="some other funny param"
PARAM3="third spaced param"
#...

PARAMS=$PARAM1
PARAMS+='" "'
PARAMS+=$PARAM2
PARAMS+='" "'
PARAMS+=$PARAM3
#...

eval command '"'$PARAMS'"'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...