Bash 我如何才能删除“删除”;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 您可以添加评论

在删除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

您可以添加评论:

# 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:是,但使用
:-
将抑制此操作。您可以在th
set-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:是,但使用
:-
将抑制此操作。您可以在th
set-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
。毕竟,这取决于实际使用变量的应用程序,拼写是意料之中的。我也会直觉地知道