【问题标题】:Bash: Read from host list, Create/Touch file while adding contentBash:从主机列表中读取,添加内容时创建/触摸文件
【发布时间】:2018-01-08 16:15:12
【问题描述】:

希望从具有主机名、ip 的主机列表中读取。想为主机名创建一个文件并将ip添加到其中。这是针对 ansible host_var 文件的。

HOSTS="\
10.10.10.1,host1 \
10.10.10.2,host2 \
10.10.10.3,host3 \
"

cmd() {
  touch /tmp/test/$HOST
}

for j in $HOSTS; do
  IP='echo $j | cut -d: -f1'
  export HOST='echo $j | cut -d: -f2'
  cmd echo "ansible_host: $IP" > $HOST
done

一个更简单的版本..

HOSTS="10.10.10.1,host1
10.10.10.2,host2
10.10.10.3,host3"

while IFS="," read -ra line; do
  echo "ansible_host: '${line[0]}'" > "${line[1]}"
done <<< "$HOSTS"

虽然我省略了 400 台主机。我在这两个 .sh 脚本上遇到的错误都在 echo 行上。

./touchfile.sh:第 425 行: echo:找不到命令 ./touchfile.sh:第 425 行: echo:找不到命令

对我做错了什么有帮助吗?

【问题讨论】:

  • 您显示的代码不会产生该错误,这仅仅是因为您没有显示 425 行代码。您需要确保此处显示的代码会产生错误。
  • 你想要 HOST=$(echo $j | cut -d: -f2) (或者你可以用 back-tics 替换 $( ) 并具有与石器时代兼容的 cmd-substitution。但我不知道如何正确处理 echo "ansible_host: $IP" &gt; $HOST由您的cmd() 定义,如上定义。祝你好运。
  • 谢谢!是的,函数的使用已经过时了。

标签: linux bash


【解决方案1】:

不要将值存储在变量中;使用此处的文档。此外,不需要数组;只需为每个字段指定 read 单独的名称即可。

while IFS=, read -r addr name; do
    printf "ansible_host: '%s'\n" "$addr" >> "$name"
done <<EOF
10.10.10.1,host1
10.10.10.2,host2
10.10.10.3,host3
EOF

【讨论】:

  • 谢谢,这只是我想要的,只需稍加调整即可。当我得到 ansible_host: '10.10.10.10' 时,我删除了 %s 上的单引号。所以现在我有了 ansible_host: 10.10.10.10。如此简单,感谢您的快速帮助!
猜你喜欢
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2016-08-22
  • 2013-07-06
  • 2015-02-05
相关资源
最近更新 更多