因此,我正在尝试使用bash脚本自动创建用户。我有以下脚本:
#!/bin/bash
cd /tmp/new/
cat autoid`date +%Y%m%d`.csv | grep "THING" | grep "4B"
while read -r line;
do
name=$(awk -F';' '{print $10}' | awk -F' ' '{print $1}')
surname=$(awk -F';' '{print $10}'|awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}')
userid=$(awk -F';' '{print $8}')
bash new_user.sh $userid $name $surname
sleep 1
bash basic_access.sh C $userid
sleep 1
done
问题是我在这里有点困惑。我正在使用echo代替调用其他bash脚本来测试命令,除了“ cat autoid date +%Y%m%d
。csv | grep” THING“ | grep” 4B“的输出之外,它什么也没有返回”行。试图将该行的末尾传递到while循环中,但是它仍然无法正常工作。
我在这里做什么错了?
答案 0 :(得分:2)
您需要将输出通过管道传递到while
循环。变量line
应该分别传递给每个awk
进程(以解决您的紧迫问题;请继续阅读以寻求更好的解决方案):
#!/bin/bash
cd /tmp/new/
cat autoid`date +%Y%m%d`.csv | grep "THING" | grep "4B" |
while read -r line;
do
name=$(echo "$line" | awk -F';' '{print $10}' | awk -F' ' '{print $1}')
surname=$(echo "$line" | awk -F';' '{print $10}'|awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}')
userid=$(echo "$line" | awk -F';' '{print $8}')
bash new_user.sh $userid $name $surname
sleep 1
bash basic_access.sh C $userid
sleep 1
done
但是,反复调用awk
以获取单个字段效率低下。让read
进行拆分。 (包括其他各种修复和改进。)
grep "THING" "autoid$(date +%Y%m%d).csv" | grep "4B" |
while IFS=";" read -ra fields; do
read name surname <<< "${fields[9]}"
userid=${fields[7]}
bash new_user.sh "$userid" "$name" "$surname"
sleep 1
bash basic_access.sh C "$userid"
sleep 1
done