как присвоить функцию с аргументами переменной, затем передайте переменную другой функции в сценарии оболочки

Я плохо знаком со сценарием оболочки, таким образом, любая информация не тривиальна вообще. Я пишу родовую функцию create_dir то взятие переменная $dirname и переменная опции $function генерировать каталог. Если дополнительное $function отсутствует, функция по умолчанию mkdir. Как это:

Файл ~/bin/lib/create_dir.sh:

#!/bin/bash

create_dir()
{
    DIRNAME=$1
    FUNCTION=${2:-mkdir}
    $FUNCTION $DIRNAME
}
export -f create_dir

Это хорошо работает.

Теперь я импортирую это в другой файл ~/bin/create_app

#!/bin/bash
. "${HOME}/bin/lib/create_dir.sh"

DIRNAME=$1
FUNCTION="python manage.py startapp"

create_dir $FUNCTION $DIRNAME

Когда я работаю create_app это импортировало create_dir но переменная $FUNCTION это питается create_dir является неправильным. Переменная $FUNCTION имеет только одно слово python вместо python manage.py startapp поскольку я хотел.

Почему? Как зафиксировать его?

0
задан 1 February 2019 в 12:30

1 ответ

Необходимо заключить аргумент в кавычки как это: "$FUNCTION". Иначе оболочка будет работать

create_dir python manage.py startapp ... 

сопровождаемый всеми словами в первом аргументе create_app. Таким образом, первый аргумент create_dir будет python и второй manage.py.

Вы всегда находитесь на безопасной стороне при помещении двойных кавычек вокруг переменных расширений. Это будет препятствовать тому, чтобы оболочка разделила значение той переменной в отдельные слова, которые функция затем рассматривает как различные аргументы, когда Вы передаете ему что переменная как аргумент.

Существуют случаи, где можно обойтись без помощи кавычек, например, в строке

DIRNAME=$1

или в более общем плане

var2=$var

поскольку удар автоматически предположит, что Вы хотите присвоить все значение var к переменной var2. С другой стороны, если Вы пишете значение непосредственно, необходимо использовать кавычки:

string="Hello World"
0
ответ дан 26 October 2019 в 10:00

Другие вопросы по тегам:

Похожие вопросы: