我想使用标准工具和bash打印Linux上的所有环境变量.我需要看到环境名称和屏蔽变量,如果变量长度大于5(qwerty->***rty),则最后3个字符可见,如果小于5(或等于5),则屏蔽值带有1个可见字符(zxc->**c).

示例:

FOO=qwerty
BAR=asdfghjkl
BAZ=zxc

我期待打印以下命令:

FOO=***rty
BAR=******jkl
BAZ=**c

原始值和掩码的长度在这里是相同的.

当时我试图使用这条awk命令来实现这一点,但它只处理了其中的一些情况,将所有的Word替换为3 *,并将值减少到最后3个字符(我不太擅长awk,所以也许可以更好地实现它):

env | awk -F= '{ if(length($2)>5) {printf("%s=***%s\n", $1, substr($2, length($2)-2))} }'

推荐答案

bash%的解决方案可能是:

#!/bin/bash

env |
while IFS='=' read -r name value; do
    n=$((${#value} > 5 ? -3 : ${#value} > 0 ? -1 : 0))
    head=${value:0:n}
    printf '%s=%s%s\n' "$name" "${head//?/'*'}" "${value:n}"
done

注意:在shell 编程中,按while read循环读取行的效率很低.我假设env命令发出的输出足够小,因此这种低效并不严重.您不应该将此技术用于大型输入.

Linux相关问答推荐

在Bluez/Linux中,周期性与连续蓝牙设备发现的已知缺陷是什么?

变量在vim中打印良好,但在bashshell中打印不好,这怎么可能发生?

bind() 错误 98 - 地址已在使用中

在 Linux 中屏蔽文件中的位 - 按位运算

如何修复 script(1) 实用程序输出的换行符?

线程创建会在 Linux 中触发页面错误吗?它与软脏 PTE 有什么关系?

如何在 ERE 中结束这个正则表达式

c++进程状态中的+是什么意思

8 个半小时范围的 Crontab 表达式

访问证书里面的图片

如何使用 shell 脚本查找具有最大上下文长度的行号?

根据文件名对目录中的文件进行 chgrp

查找在特定日期从特定机器登录的所有用户

为什么 mmap() 比顺序 IO 快?

以原子方式移动目录

从 FTP 服务器下载所有文件

ldconfig 错误:使用 Linux 加载程序时不是符号链接

如何安装python开发者包?

如何为 Git 命令设置自动完成功能?

env和set(在 Mac OS X 或 Linux 上)有什么区别?