printf -v 在 Bitbucket 管道中是非法选项。还有一个关于

printf -v 在 Bitbucket 管道中是非法选项。还有一个关于

你好,我是 shell 脚本的新手,如果这很微不足道,我很抱歉。如何使用printf带有选项的命令-v

在我们的deployment.sh文件中有这一行 printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT"

echo 'Initializing new deployment'
printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT"
echo "commit string $BITBUCKET_COMMIT_str"

当 Bitbucket 管道运行时,它总是在这一行失败。随着错误printf -v is an illegal option

来自 Bitbucket 的错误


Initializing new deployment
commit string 
deployment.sh: 28: printf: Illegal option -v
bash: -c: line 1: syntax error: unexpected end of file
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! XXXXX deploy: `sh deployment.sh`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the XXXX deploy script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/XXX-debug.log

我已经printf -v在本地终端中测试了该命令,它工作正常,所以我不知道为什么它在 Bitbucket 构建管道中不起作用。我尝试printf仅用变量替换,但后来在文件中出现语法错误。我认为这是因为我们尝试使用变量作为另一个命令的输入

"bash -s $BITBUCKET_COMMIT_str" <<\HERE
     echo "TEST MADE IT HERE"
     BUILD_FOLDER="BUILD_$BITBUCKET_COMMIT"
     echo "Build: $BUILD_FOLDER"
    ...
    HERE

另一方面,我不完全确定上面的脚本想要做什么。我一直无法找到该bash -s命令的作用。我认为这个命令正在尝试附加一个包含HERE块内容的文件。除非我更改为“块内的代码似乎运行”,否则块内的脚本HERE似乎不会运行。但据我了解,这种改变并没有真正的意义。<<>>HERE<<

任何帮助将不胜感激。我的大部分团队成员都在度假,所以我对此感到很艰难。提前致谢 :)

答案1

printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT"
echo "commit string $BITBUCKET_COMMIT_str"

deployment.sh: 28: printf: Illegal option -v

这看起来像是来自 Debian 的 Dash 的错误消息/bin/sh。这就是问题所在,脚本开头的 hashbang 是否正确,但您已经在评论中提到了这一点。

解决方法-v是使用命令替换,var=$(printf whatever)但随后您会遇到问题,因为 Dash 也不支持这一点,并且由于也不支持扩展,因此%q替换起来有些困难。${var/pattern/replacement}

但请看下一行。您正在使用该变量BITBUCKET_COMMIT_str来打印给用户。这并不一定需要引用对 shell 输入有效的引用,而这正是需要的%q。 (甚至%q不会产生漂亮的输出,它会优先使用反斜杠而不是仅使用单引号。)因此,如果这是您使用该变量的唯一位置,并且它不包含换行符(如果它是提交 ID)或者这样,它可能不会),你可能可以printf完全跳过,并使用类似这样的东西:

echo "commit string '$BITBUCKET_COMMIT'"

如果你真的需要 Bash %q,并且 Bash 完全可用,一个明显但非常过分的解决方案是调用 Bash 来执行此操作:

quotedvar=$(bash -c 'printf %q "$1"' bash "$var")

相关内容