Bash 我如何才能删除“删除”;SC2154“;环境变量警告
在删除shell脚本时,如何删除shellcheck的警告“SC2154”Bash 我如何才能删除“删除”;SC2154“;环境变量警告,bash,shell,lint,shellcheck,Bash,Shell,Lint,Shellcheck,在删除shell脚本时,如何删除shellcheck的警告“SC2154” #!/bin/bash set -euo pipefail IFS=$'\n\t' echo "proxy=$http_proxy" | sudo tee -a /etc/test.txt 警告为“SC2154:http_代理被引用但未分配。” 编辑: 我想使用sudo将环境变量“http\u proxy”写入test.txt文件。如上所述,如果您尝试使用(可能)未初始化变量$http\u proxy 您可以添加评论
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
echo "proxy=$http_proxy" | sudo tee -a /etc/test.txt
警告为“SC2154:http_代理被引用但未分配。”
编辑:
我想使用sudo将环境变量“http\u proxy”写入test.txt文件。如上所述,如果您尝试使用(可能)未初始化变量
$http\u proxy
您可以添加评论:
# shellcheck disable=SC2154
echo "proxy=$http_proxy" | ...
但是,更好的解决方案是修复脚本。这里,您似乎假设
http\u proxy
是一个环境变量。如果是这种情况,您应该坚持命名约定并将其称为HTTP\u PROXY
。Shellcheck遵守此约定,不会显示警告。如上所述,您尝试使用(可能)未初始化变量$http\u proxy
您可以添加评论:
# shellcheck disable=SC2154
echo "proxy=$http_proxy" | ...
但是,更好的解决方案是修复脚本。这里,您似乎假设
http\u proxy
是一个环境变量。如果是这种情况,您应该坚持命名约定并将其称为HTTP\u PROXY
。Shellcheck遵守此约定,不会显示警告。另外,如果警告为null或未设置,则可以显式将http\u proxy
扩展为nothing:
echo "proxy=${http_proxy:-}"
另外,为了抑制警告,如果警告为null或未设置,则可以显式将http_proxy扩展为nothing(无):
echo "proxy=${http_proxy:-}"
不清楚,为什么要在echo中再次打印
http\u proxy
?请澄清您的问题,并让我们知道您在这里真正想要实现什么?@user5580578:我看不出您会在脚本中的任何地方写入变量http\u proxy
。我甚至不明白为什么它会是一个环境变量(除非它是由父进程导出的)。@user5580578:在这个脚本中,将空格作为有效的IFS
删除有什么意义?我看不出这在这里会有什么影响。@user1934428 http\u proxy作为一个环境变量是非常常见的。@user1934428我经常看到它是小写的,就像大写一样,并且它经常被导出到全局的某个地方,比如.profile或.bashrc.Not clear,为什么要在echo中再次打印http\u proxy
?请澄清您的问题,并让我们知道您在这里真正想要实现什么?@user5580578:我看不出您会在脚本中的任何地方写入变量http\u proxy
。我甚至不明白为什么它会是一个环境变量(除非它是由父进程导出的)。@user5580578:在这个脚本中,将空格作为有效的IFS
删除有什么意义?我看不出这在这里会有什么影响。@user1934428 http\u proxy作为一个环境变量是非常常见的。@user1934428我经常看到它是小写的,就像大写的一样,并且它经常被导出到全局的某个地方,比如.profile或.bashrc。我认为这会改变脚本的行为(请参见设置-u管道故障)。如果,也许你可以插入一个,但我不确定这是否会修复警告。@Socowi:为什么?在参数扩展中使用:-
不会影响echo
的退出代码。echo
只会输出一个换行符。@user1934428当shell脚本在set-e
exp下运行时对未设置的变量进行anding将导致脚本退出。因此,如果未设置http\u proxy
,OP可能打算退出脚本。此解决方案具有不同的行为-如果未设置变量,则将其替换为空。@KamilCuk:是,但使用:-
将抑制此操作。您可以在thset-e;echo${foobar:-};echo xxx
。这就是为什么我反对Socowi的说法,即您的解决方案会改变行为。@user1934428在您的示例中,-u
也很重要:bash-c'set-eu;echo${foobar:-};echo xxx'
总是打印xxx
而bash-c'set-eu;echo foobar;echo xxx'
打印xxx
当且仅当foobar
被设置时。我假设后者正是OP想要的。我认为这会改变脚本的行为(请参见set-u pipefail)
。如果
,也许你可以插入一个,但我不确定这是否会修复警告。@Socowi:为什么?在参数扩展中使用:-
不会影响echo
的退出代码。echo
只会输出一个换行符。@user1934428当shell脚本在set-e
exp下运行时对未设置的变量进行anding将导致脚本退出。因此,如果未设置http\u proxy
,OP可能打算退出脚本。此解决方案具有不同的行为-如果未设置变量,则将其替换为空。@KamilCuk:是,但使用:-
将抑制此操作。您可以在thset-e;echo${foobar:-};echo xxx
。这就是为什么我反对Socowi的说法,即您的解决方案会改变行为。@user1934428在您的示例中,-u
也很重要:bash-c'set-eu;echo${foobar:-};echo xxx'
总是打印xxx
,而bash-c'set-eu;echo foobar;echo xxx'
打印xxx
当且仅当foobar
已设置时。我假设后者正是OP想要的。我也会直观地为HTTP\u代理使用大写字母,但作为用户@JosephSible他在上面的评论中指出,变量也经常用小写形式。事实上,文章中说使用http\u proxy
。毕竟,这取决于实际使用变量的应用程序,拼写是意料之中的。我也会直觉地知道