Я пишу сценарий bash, где мне нужно передать строку с пробелами в функцию в моем сценарии bash.
Например:
#!/bin/bash
myFunction
{
echo $1
echo $2
echo $3
}
myFunction "firstString" "second string with spaces" "thirdString"
При запуске я ожидаю вывод:
firstString
second string with spaces
thirdString
Тем не менее, что на самом деле вывод:
firstString
second
string
Есть ли способ передать строку с пробелами в качестве одного аргумента функции в bash?
echo "$@"
илиfor i in "$@"; do echo $i ; done
для использования правильно указаны параметры, содержащие пробелы. Это очень четко указано во всейbash
документации вpositional parameters
разделе.myFunction "$@"
Ответы:
Вы должны поставить кавычки, а также, ваше объявление функции неверно.
И, как и другие, это работает и для меня. Скажите нам, какую версию оболочки вы используете.
источник
$@
ведет себя так же, как и без кавычек$*
- результаты разделяются на строки, а затем по отдельности расширяются глобусом, поэтому, если у вас есть вкладки, они будут преобразованы в пробелы, если у вас есть слова, которые могут быть оценены как выражения глобуса, они будет и т. д.Другое решение вышеупомянутой проблемы - установить каждую строку в переменную, вызвать функцию с переменными, обозначенными буквальным знаком доллара
\$
. Затем в функции используйтеeval
для чтения переменной и вывода, как ожидается.Выходные данные тогда:
Пытаясь решить аналогичную проблему, я столкнулся с проблемой UNIX, полагая, что мои переменные разделены пробелом. Я пытался передать строку с разделителем в функцию,
awk
чтобы установить ряд переменных, которые позже использовались для создания отчета. Сначала я попробовал решение, опубликованное ghostdog74, но не смог заставить его работать, так как не все мои параметры передавались в кавычках. После добавления двойных кавычек к каждому параметру он начал функционировать как ожидалось.Ниже приведено состояние «до» моего кода и полностью функционирует после состояния.
До - неработающий код
После - функциональный код
источник
Простейшее решение этой проблемы заключается в том, что вам нужно использовать
\"
аргументы, разделенные пробелами, при запуске сценария оболочки:источник
Ваше определение myFunction неверно. Так должно быть:
или:
Во всяком случае, это выглядит хорошо и отлично работает для меня на Bash 3.2.48.
источник
Я опоздал на 9 лет, но более динамичный путь был бы
источник
Простое решение, которое сработало для меня - цитируется $ @
Я мог проверить фактическую команду grep (благодаря set -x).
источник
Вы могли бы иметь расширение этой проблемы в случае, если ваш исходный текст был установлен в переменную строкового типа, например:
В этом случае, если вы не передадите переменную status_message вперед как строку (заключенную в ""), она будет разбита на монтирование различных аргументов.
«$ variable» : текущий трек - CDE на DEF от ABC
переменная $ :
источник
myFunction "firstString" "second string with spaces" "thirdString"
и у него это не сработало. То, что вы предлагаете, не относится к этому вопросу.Была такая же проблема, и на самом деле проблема была не в функции и не в вызове функции, а в том, что я передал в качестве аргументов функции.
Функция была вызвана из тела скрипта - 'main' - поэтому я передал "st1 a b" "st2 c d" "st3 e f" из командной строки и передал ее функции, используя myFunction $ *
$ * Вызывает проблему, поскольку расширяется в набор символов, которые будут интерпретироваться при вызове функции с использованием пробела в качестве разделителя.
Решение состояло в том, чтобы изменить вызов функции при явной обработке аргументов с «основного» на функцию: тогда вызовом будет myFunction «$ 1» «$ 2» «$ 3», который сохранит пробел внутри строк, поскольку кавычки будут разделять аргументы ... Таким образом, если параметр может содержать пробелы, он должен обрабатываться явно во всех вызовах функций.
Поскольку это может быть причиной долгих поисков проблем, может быть разумно никогда не использовать $ * для передачи аргументов ...
Надеюсь, это поможет кому-нибудь, когда-нибудь, где-то ... Январь
источник
"$@"
, не все кавычки"$1"
,"$2"
... позиционный paramters ни$*
.