【问题标题】:Reading a file and passing parameters to other shell scripts line by line逐行读取文件并将参数传递给其他shell脚本
【发布时间】:2018-09-28 14:53:53
【问题描述】:

所以,我正在尝试使用 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 autoiddate +%Y%m%d.csv | grep "THING" | grep "4B"" 行的输出之外,它没有返回任何内容.试图将此行的末尾流水线到 while 循环,但它无论如何都不起作用。

我在这里做错了什么?

【问题讨论】:

  • read -r line 应该读取什么内容?用于设置name 等的各种awk 命令是什么?应该读什么?
  • @chepner 我正在尝试读取以分号作为分隔符的 csv 文件。变量(名称、姓氏、用户 ID)中的代码工作正常,问题是,我如何将“cat autoiddate +%Y%m%d.csv | grep "THING" | grep "4B"" 的输出发送到其他命令,逐行。

标签: bash shell while-loop


【解决方案1】:

您需要将输出通过管道传输到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

【讨论】:

  • 谢谢!第二个代码运行良好。第一个没有,虽然
  • 我没有尝试调试第一个代码;可能还有其他未确定的错误在第二个版本中得到了修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2018-02-25
  • 2013-08-21
相关资源
最近更新 更多