Я плохо знаком со сценарием оболочки, таким образом, любая информация не тривиальна вообще. Я пишу родовую функцию 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
поскольку я хотел.
Почему? Как зафиксировать его?
Необходимо заключить аргумент в кавычки как это: "$FUNCTION"
. Иначе оболочка будет работать
create_dir python manage.py startapp ...
сопровождаемый всеми словами в первом аргументе create_app
. Таким образом, первый аргумент create_dir
будет python
и второй manage.py
.
Вы всегда находитесь на безопасной стороне при помещении двойных кавычек вокруг переменных расширений. Это будет препятствовать тому, чтобы оболочка разделила значение той переменной в отдельные слова, которые функция затем рассматривает как различные аргументы, когда Вы передаете ему что переменная как аргумент.
Существуют случаи, где можно обойтись без помощи кавычек, например, в строке
DIRNAME=$1
или в более общем плане
var2=$var
поскольку удар автоматически предположит, что Вы хотите присвоить все значение var
к переменной var2
. С другой стороны, если Вы пишете значение непосредственно, необходимо использовать кавычки:
string="Hello World"