Stu*_*ole 0 shell shell-script variable
我正在尝试设置一个 shell 变量并将其作为带有以下代码的 shell 脚本的一部分传递给命令:
SLS_DEBUG_TEXT=""
if [ "$ENABLE_DEBUG_LOGGING" = "true" ]; then
SLS_DEBUG_TEXT="SLS_DEBUG=* "
fi
$SLS_DEBUG_TEXT sls create_domain -v $AWS_PROFILE_FLAG --stage $STAGE // gives error
#SLS_DEBUG=* sls create_domain -v $AWS_PROFILE_FLAG --stage $STAGE // works correctly
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
./sls-deploy.sh: line 110: SLS_DEBUG_TEXT: command not found
Run Code Online (Sandbox Code Playgroud)
该if语句大多无关紧要,但我想表明需要有条件地设置此变量(即我并不总是希望启用调试日志记录)。代码片段中的最后一行(已注释掉)是如果启用了调试日志记录并且可以正常工作的命令应该是什么样子。
我在这里和 Stack Overflow 上发现了一些以前的帖子,其中问题是由于设置变量(示例)时等号之间的空格引起的,但我认为我没有在这里落入那个陷阱。
谢谢你的帮助。
$SLS_DEBUG_TEXT在 shell 将其值视为赋值的阶段之后扩展为时已晚。因此,变量的值被视为命令。
你可以做的是使用env:
SLS_DEBUG_TEXT='SLS_DEBUG=*'
env "$SLS_DEBUG_TEXT" sls create_domain -v "$AWS_PROFILE_FLAG" --stage "$STAGE"
Run Code Online (Sandbox Code Playgroud)
注意每一个变量扩展周围的引用。
如果SLS_DEBUG_TEXT可能为空或未设置,则上述内容会产生错误,因为env会尝试执行没有名称的命令。
要解决这个问题,您可以改为使用
SLS_DEBUG_TEXT='SLS_DEBUG=*'
env ${SLS_DEBUG_TEXT:+"$SLS_DEBUG_TEXT"} sls create_domain -v "$AWS_PROFILE_FLAG" --stage "$STAGE"
Run Code Online (Sandbox Code Playgroud)
该${SLS_DEBUG_TEXT:+"$SLS_DEBUG_TEXT"}会扩大到"$SLS_DEBUG_TEXT"如果变量被设置且非空。否则它会扩展为空(甚至不是空字符串,这就是"$SLS_DEBUG_TEXT")。
还要注意的是,如果你有SLS_DEBUG_TEXT='SLS_DEBUG=* '(在你的代码),以后空间*会成为价值的一部分SLS_DEBUG在sls进程的环境。我不知道这是故意的还是无意的。
我还注意到您引用的错误消息说
./sls-deploy.sh: line 110: SLS_DEBUG_TEXT: command not found
Run Code Online (Sandbox Code Playgroud)
对我来说,这表明您$在脚本中的某个时刻使用了变量名而没有放在变量名前面。这可能与您遇到的主要问题完全无关。您显示的代码会导致错误
./sls-deploy.sh: line NNN: SLS_DEBUG=*: command not found
Run Code Online (Sandbox Code Playgroud)