Git bash:扩展函数参数

Git bash:扩展函数参数,git,bash,function,shell,Git,Bash,Function,Shell,我对正在编写的shell脚本的bash函数有一个问题。功能如下: do_command() { if [[ $DRY_RUN ]]; then echo $@ else $@ fi } 函数很简单,如果设置了DRY_RUN标志,我们只需打印该方法,否则将执行该方法。这适用于大多数命令,但git tag命令除外,我已经尝试了不同版本的命令,如: do_command git tag -a $NEW_VERSION -m '$INPUT_COMMENT' 它实际执行t

我对正在编写的shell脚本的bash函数有一个问题。功能如下:

do_command() {
  if [[ $DRY_RUN ]]; then
    echo $@
  else
    $@
  fi
}
函数很简单,如果设置了DRY_RUN标志,我们只需打印该方法,否则将执行该方法。这适用于大多数命令,但git tag命令除外,我已经尝试了不同版本的命令,如:

do_command git tag -a $NEW_VERSION -m '$INPUT_COMMENT'
它实际执行tag命令,但给出注释$INPUT\u comment

我尝试了另外两个版本,它们提供了正确的echo输出,但不允许我执行git-tag命令

do_command git tag -a $NEW_VERSION -m "$INPUT_COMMENT"

有什么方法可以使echo和git命令在这个调用中都起作用吗?还是需要在do_命令版本中进行分析?

使用带引号的“$@”来正确处理带空格的参数。如果只写
$@
,那么当
$INPUT\u COMMENT
包含空格时,
git
命令将不起作用

do_command() {
  if [[ $DRY_RUN ]]; then
    echo "$@"
  else
    "$@"
  fi
}
用法:

do_command git tag -a $NEW_VERSION -m "$INPUT_COMMENT"
使用带引号的
“$@”
正确处理带空格的参数。如果只写
$@
,那么当
$INPUT\u COMMENT
包含空格时,
git
命令将不起作用

do_command() {
  if [[ $DRY_RUN ]]; then
    echo "$@"
  else
    "$@"
  fi
}
用法:

do_command git tag -a $NEW_VERSION -m "$INPUT_COMMENT"

我建议
printf'%q''$@;echo
代替干式运行案例;通过这种方式,输出在视觉上区分了
“foo bar”baz
foo bar baz
。我主张在变量的每次使用时使用双引号(除非您明确希望在值中使用空格产生效果),因此也要使用
“$DRY_RUN”
“$NEW_VERSION”
。如果
DRY\u RUN
“true”
“false”
,您只需在“$DRY\u RUN”中写入
;然后
。使它更具可读性。@Alfe,…嗯,
[[]]
是一个例外情况
$DRY_RUN
不需要在此处引用,因为上下文隐式地防止字符串拆分和全局扩展。不过,一般来说,你完全正确。@Alfe,(我倾向于考虑使用<代码>真的< /COD>或<代码> false <代码>作为值非常糟糕的形式,将它们作为命令来评估意味着您正在运行任意命令,如果您编写的参数跨越权限边界的脚本,则进入一个危险的习惯;在这里进行空VS非空测试远好于零,或者零对非。零等)@CharlesDuffy您在安全方面是对的。但是,如果您只是使用自己的代码,并且只使用自己的变量、标志等,我认为可读性比模糊的安全性更重要。但问题是,人们永远不知道脚本或其一部分以后是否会在不同的上下文中使用。因此,如果您关心这一点,您可能会使用
0
/
1
或空/非空值和测试,如
如果[“$flag”=1];那么
。我建议将
printf“%q'”$@;echo
用于干运行情况;这样输出可以直观地区分
和“foo bar”baz
foo bar baz
。我主张在变量的每次使用时使用双引号(除非您明确希望在值中使用空格),因此也要使用
“$DRY_RUN”
“$NEW_VERSION”
。如果
DRY_RUN
“true”
“false”
如果“$DRY_-RUN”,您只需编写
,然后,
。使其更可读。@Alfe,…嗯,
[[[]]
是一种例外情况;
$DRY_-RUN
不需要在此处引用,因为上下文隐式地防止字符串拆分和全局扩展。不过,一般来说,您完全正确。@Alfe,(我倾向于考虑使用<代码>真的< /COD>或<代码> false <代码>作为值非常糟糕的形式,将它们作为命令来评估意味着您正在运行任意命令,如果您编写的参数跨越权限边界的脚本,则进入一个危险的习惯;在这里进行空VS非空测试远好于零,或者零对非。零等)@CharlesDuffy您在安全方面是对的。但是,如果您只是使用自己的代码,并且只使用自己的变量、标志等,我认为可读性比模糊的安全性更重要。但问题是,人们永远不知道脚本或其一部分以后是否会在不同的上下文中使用。因此,如果您关心这一点,您可能会使用
0
/
1
或空/非空值以及类似
的测试(如果[“$flag”=1])会感觉更安全;那么
。顺便说一句,本可以在不需要调用人工审查的情况下捕获此项。(另一方面——对于shell内置变量和环境变量,所有大写名称都是常规的,但是对于常规的、未导出的变量,使用它们是不好的,因为这意味着您可能会无意中覆盖其他类别中的变量)。请记住,像
do_command
这样的命令只适用于简单的命令。没有管道,没有
&&
/
|
列表,没有I/O重定向,没有复杂的命令:除了命令名及其参数之外,没有任何需要语法的命令。@CharlesDuffy感谢您的反馈,对于帮助您的在线工具总是很好,更新了lowe case.BTW中的所有变量都会捕获到这个变量,而无需调用人工审阅(另一方面,所有大写名称对于shell内置变量和环境变量来说都是常规的,但是对于常规的、未导出的变量使用它们是不好的形式,因为这意味着您可能会无意中覆盖其他类别中的变量)。请记住,像
do_command
这样的命令只适用于简单的命令。没有管道,没有
&&
/
|
列表,没有I/O重定向,没有复杂的命令:除了命令名及其参数之外,没有任何需要语法的命令。@CharlesDuffy感谢您的反馈,对于帮助您的在线工具总是很好,更新了将所有变量转换为lowe大小写。