如何将带有参数的函数分配给变量,然后将变量传递给 shell 脚本中的另一个函数

如何将带有参数的函数分配给变量,然后将变量传递给 shell 脚本中的另一个函数

我是 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变量是错误的。变量只有一个字,而不是我想要的。$FUNCTIONcreate_dir$FUNCTIONpythonpython 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"

相关内容