shell script 逐行读取配置文件

DevOps · lvjian700 · Created at · Last by hkliya Replied at · 1467 hits
30

本文将介绍一种方法用来逐行读取如下配置文件,其中将使用 readIFS 指令。

配置文件:

sqs:aws-sqs-queue-name
email:myemail@gmail.com

shell script

while IFS='' read -r line || [[ -n "$line" ]]; do
  IFS=':' read -r protocol endpoint <<< "$line"
  echo "Protocol: $protocol - Endpoint: $endpoint"
done < "$file"

输出:

Protocol: sqs - Endpoint: aws-sqs-queue-name
Protocol: email - Endpoint: myemail@gmail.com

read 和 IFS

通常情况下 readIFS 会一起配合使用。其中

  • read 通常用于读取数据和用户输入,文本使用它从字符串中读取变量。
  • IFS(Internal Field Separator) 用来 read 指令中的分隔符。我们可以用分割字符串,并且读取到不同的变量中。

使用 read 读取一行数据到变量:

文件:

sqs:aws-sqs-queue-name

shell script

file=$1
read -r line <<< "$file"
echo $line # => sqs:aws-sqs-queue-name

此时 -r 参数代表 raw,忽略转移字符。例如将 \n 视为字符串,而不是换行符。

读取用户名和hostname:

echo "ubuntu@192.168.1.1" | IFS='@' read -r username hostname
echo "User: $username, Host: $hostname" # => User: ubuntu, Host: 192.168.1.1

读取程序的版本号:

git describe --abbrev=0 --tags  #=> my-app-1.0.1
$(git describe --abbrev=0 --tags) | IFS='-' read -r _ _ version
echo $version # => 1.0.1

实战应用

最近在处理 AWS SNS(Simple Notification Service)SQS(Simple Queue Service) 时,由于 AWS SNS 的限制,不能使用 Cloudformation Stack 修改 SNS Topic 的 Subscriptions,只能通过 AWS Console 或者 aws-cli 更新 subscriptions。

因此采用了如下方案:

  1. 使用 Cloudformation stack 管理 SNS 和 SQS
  2. 使用 aws-cli 管理 subscriptions (写 shell script)

使用 shell 逐行读取文件出现在步骤2中。

为了方便管理,所有 Subscriptions 放在配置文件中:

配置文件:

sqs:aws-sqs-queue-name
email:myemail@gmail.com

shell script 会解析上述文件,并且执行两条 aws-cli 指令

file=@1

while IFS='' read -r line || [[ -n "$line" ]]; do
  IFS=':' read -r protocol endpoint <<< "$line"
  # create subscription for the topic
  aws sns subscribe --topic-arn $topic_arn --protocol $protocol --notification-endpoint $endpoint
done < "$file"

参考资料


「软件匠艺社区」旨在传播匠艺精神,通过分享好的「工作方式」和「习惯」以帮助程序员更加快乐高效地编程。
共收到 3 条回复
1
hkliya · #1 ·

好久没见你冒泡了,终于回来了,好开心!

30
lvjian700 · #2 ·

#1楼 @hkliya 哈哈,多谢关注。
最近难得有时间写点东西。

最近写了一个月的shell script,打算写几篇 shell 的文章。

BTW,要不要搞一个 DevOps 的分组?
发文章的时候,把这篇放 terminal 里感觉怪怪的。

1

#2楼 @lvjian700 开了,挪过去了哦。

需要 Sign In 后回复方可回复, 如果你还没有账号你可以 Sign Up 一个帐号。