Bash Awk输出不一致
我已经创建了一个bash脚本,该脚本可以附加或覆盖/etc/environment中的一些现有环境变量。脚本如下所示: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" "
#!/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