shell 使用文件进行Bash脚本练习

q35jwt9p  于 2023-03-09  发布在  Shell
关注(0)|答案(1)|浏览(187)

我有这样一个练习:创建一个"groups" BASH shell脚本,该脚本将groups_file.txt文件作为参数,结构如下:

adm:x:4:syslog,adm1
admins:x:1006:adm2,adm12,manuel
ssl-cert:x:122:postgres
alan2:x:1009:aceto,salvemini
conda:x:1011:giovannelli,galise,aceto,caputo,haymele,salvemini,scala,adm2,adm12 
adm1Group:x:1022:adm2,adm1,adm3
docker:x:998:manuel

即:
1.打印给定文件中一行的最大字段数
1.为文件中的每个组创建一个子目录,为组"adm"和"admins"的用户提供读写访问权限
1.逐行为包含属于该组的用户的每个子目录创建文件
我做了前两点,但我不知道如何做最后一点。我试图用awk使组等于$1,然后我将它们重定向到"$group/user"文件,但它不起作用

#!/bin/bash

echo "Stampo il numero massimo di campi di una linea in un dato file: "
cat groups_file.txt | awk -F "[\t,:]" 'NF>6 {print $0}' 

g=$(cat groups_file.txt  | awk -F :  '{print $1}')

for group in $g
do
        mkdir "$group"
        chmod +rwx "$group"
        
        touch "$group"/users 
        chmod +rw "$group"/users
done
kulphzqa

kulphzqa1#

你想一次读一行,然后把它分成冒号。
一个子目录不能属于多个组,因此必须提供一个单独的机制来提供对多个组的读访问,下面我简单地将其命名为组adm;更好的解决方案可能是创建具有X1 M1 N1 X和X1 M2 N1 X的所有成员的新组。
我想“最大字段数”是指打印成员数最多的行。

#!/bin/bash

awk -F "[,:]" 'NF>max { maxline = $0; max=NF }
  END { print max, maxline }' groups_file.txt

while IFS=: read -r group pass gid members; do
    mkdir "$group"
    chown "$group":adm "$group"
    chmod 775 "$group"
    echo "${members//,/$'\n'}" >"$group"/users
done <groups_file.txt

还请注意这是如何避免useless use of cat的。

相关问题