我是 shell 脚本的新手,所以任何信息都不是微不足道的。我正在编写一个通用函数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
为什么?如何解决?
答案1
您应该像这样引用该参数:"$FUNCTION"
。否则,shell 将运行
create_dir python manage.py startapp ...
后面跟着第一个参数 中的所有单词create_app
。这样, 的第一个参数create_dir
将是python
,而第二个参数将是manage.py
。
如果您将变量扩展放在双引号内,则始终是安全的。这将防止 shell 将该变量的值拆分为单独的单词,然后当您将该变量作为参数传递给函数时,该函数会将这些单词视为不同的参数。
在某些情况下,你可以不用引号,例如在以下行中
DIRNAME=$1
或者更普遍地
var2=$var
因为 bash 会自动假设您要将 的整个值分配var
给变量var2
。另一方面,如果您直接写入值,则需要使用引号:
string="Hello World"