Bash Awk输出不一致

Bash Awk输出不一致,bash,awk,Bash,Awk,我已经创建了一个bash脚本,该脚本可以附加或覆盖/etc/environment中的一些现有环境变量。脚本如下所示: #!/bin/bash declare -a array=("http_proxy=http://username:password@proxy:8080" "https_proxy=http://username:password@proxy:8080" "

我已经创建了一个bash脚本,该脚本可以附加或覆盖/etc/environment中的一些现有环境变量。脚本如下所示:

#!/bin/bash
declare -a array=("http_proxy=http://username:password@proxy:8080"
                  "https_proxy=http://username:password@proxy:8080"
                  "ftp_proxy=ftp://username:password@proxy:8080"
                  "no_proxy=\"localhost, 127.0.0.1\""
                 )

for i in "${array[@]}"; do
        awk -v var="${i%%=*}" '$0 !~ var' /etc/environment > /etc/environment
        echo "$i" >> /etc/environment
done
给定以下输入/etc/环境:

http_proxy=http://otheruser:password@otherproxy:8080
https_proxy=http://username:password@proxy:8080
some_env_varible=some_value
我期望得到以下结果:

http_proxy=http://username:password@proxy:8080
https_proxy=http://username:password@proxy:8080
ftp_proxy=ftp://username:password@proxy:8080
no_proxy="localhost, 127.0.0.1"
some_env_variable=some_value
http_proxy=http://username:password@proxy:8080
https_proxy=http://username:password@proxy:8080
ftp_proxy=ftp://username:password@proxy:8080
no_proxy="localhost, 127.0.0.1"
但是,我得到以下输出:

http_proxy=http://username:password@proxy:8080
https_proxy=http://username:password@proxy:8080
ftp_proxy=ftp://username:password@proxy:8080
no_proxy="localhost, 127.0.0.1"
some_env_variable=some_value
http_proxy=http://username:password@proxy:8080
https_proxy=http://username:password@proxy:8080
ftp_proxy=ftp://username:password@proxy:8080
no_proxy="localhost, 127.0.0.1"
在脚本外部运行awk命令似乎工作正常,只返回与特定环境变量不匹配的行。我不明白为什么在这个脚本中不起作用

使现代化 根据要求:

$ sudo cat /etc/environment
http_proxy=http://username:password@proxy:8080
https_proxy=http://username:password@proxy:8080
ftp_proxy=ftp://username:password@proxy:8080
no_proxy="localhost, 127.0.0.1"
$ i="http_proxy=http://username2:password2@proxy:8080"
$ sudo awk -v var="${i%%=*}" '$0 !~ var' /etc/environment
https_proxy=http://username:password@proxy:8080
ftp_proxy=ftp://username:password@proxy:8080
no_proxy="localhost, 127.0.0.1"

<> P>它看起来有点繁琐,你可能想考虑以下选项:

更新原始脚本:

您编写的awk行尝试打印文件/etc/environment中不存在的所有内容。这正是grep-v所做的:

利用grep的强大功能:

现在我们使用grep,您应该知道这个标志

-f FILE,-FILE=FILE从文件中获取模式,每行一个。空文件包含零个模式,因此不匹配任何内容


这样,利用进程替换

看起来有点麻烦,你可能想考虑以下选项:

更新原始脚本:

您编写的awk行尝试打印文件/etc/environment中不存在的所有内容。这正是grep-v所做的:

利用grep的强大功能:

现在我们使用grep,您应该知道这个标志

-f FILE,-FILE=FILE从文件中获取模式,每行一个。空文件包含零个模式,因此不匹配任何内容


因此,利用过程替代awk/etc/environment>/etc/environment不是一个好主意。请在脚本之外发布awk命令,我怀疑它是否能像@Cyrus所指出的那样正常工作。检查变量是否存在:if!grep-q${i%%=*}文件;然后echo$i>>/etc/environment;fi.@simlev检查更新。请注意,其目的也是覆盖现有变量,而不仅仅是在不存在时追加。awk/etc/environment>/etc/environment不是一个好主意。请在脚本之外发布awk命令,我怀疑它是否能像@Cyrus所指出的那样正常工作。检查变量是否存在:if!grep-q${i%%=*}文件;然后echo$i>>/etc/environment;fi.@simlev检查更新。请注意,其目的也是覆盖现有变量,而不仅仅是在不存在时追加。
awk -F'=' '{a[$1]=$0}END{for(i in a) print a[i] }' /etc/environment <(printf "%s\n" "${array[@]}")
cat - <<EOF awk -F'=' '{a[$1]=$0}END{for(i in a) print a[i] }' /etc/environment -
http_proxy=http://username:password@proxy:8080
https_proxy=http://username:password@proxy:8080
ftp_proxy=ftp://username:password@proxy:8080
no_proxy="localhost, 127.0.0.1"
EOF