【发布时间】:2015-12-09 04:50:20
【问题描述】:
我试图将 awk 命令的内容放入 bash 数组中,但遇到了一些麻烦。
>>test.sh
f_checkuser() {
_l="/etc/login.defs"
_p="/etc/passwd"
## get mini UID limit ##
l=$(grep "^UID_MIN" $_l)
## get max UID limit ##
l1=$(grep "^UID_MAX" $_l)
awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) print $0 }' "$_p"
}
...
使用过的文件:
示例文件:/etc/login.defs
>>/etc/login.defs
### Min/max values for automatic uid selection in useradd
UID_MIN 1000
UID_MAX 60000
示例文件:/etc/passwd
>>/etc/passwd
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
admin:x:1000:1000:Administrator,,,:/home/admin:/bin/bash
daniel:x:1001:1001:Daniel,,,:/home/daniel:/bin/bash
输出如下:
admin:x:1000:1000:Administrator,,,:/home/admin:/bin/bash
daniel:x:1001:1001:User,,,:/home/user:/bin/bash
分别(awk ... print $1 }' "$_p")
admin
daniel
现在我的问题是将 awk 输出保存在一个数组中以将其用作变量。
>>test.sh
...
f_checkuser
echo "Array items and indexes:"
for index in ${!LOKAL_USERS[*]}
do
printf "%4d: %s\n" $index ${array[$index]}
done
它可能/应该看起来像这个例子。
Array items and indexes:
0: admin
1: daniel
特别是,我会成为系统的所有用户(不是 root、bin、sys、ssh、...),而不会在阵列中阻止用户。 也许有人有其他想法来解决我的问题?
【问题讨论】:
-
发布一些示例输入(
/etc/login.defs和/etc/passwd的内容)以及该输入的预期输出。让它成为我们可以测试潜在解决方案的东西。您不需要所有这些 shell 变量和 greps - 只需一个简单的 awk 命令即可。
标签: arrays linux bash shell awk