你好,我是 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")