Bash 脚本用于从外部列表中的每个项目创建变量并运行命令

Bash 脚本用于从外部列表中的每个项目创建变量并运行命令

在我的本地机器上,我有一个文本文件,包含 IP 地址和目录名称的列表。

列表.txt

# Comment for Server 1
XXX.XX.XXX.X
DIRECTORY-NAME
# Comment for Server 2
XXX.XX.XXX.X
DIRECTORY-NAME
# Comment for Server 3
XXX.XX.XXX.X
DIRECTORY-NAME

我试图想出一些基本的东西:

#!/bin/sh
export NEWPASSWORD=m0&*a$%3JbFD*#U#N2
input="list.txt"
for every third line in input
  do
    set variable DIRECTORYNAME
for every second line in input
  do
    set variable IPADDRESS
    ssh root@$IPADDRESS cd /srv/users/myusername/apps/$DIRECTORYNAME/public/ wp user update JohnDoe --user_pass="$NEWPASSWORD"
done

这样的事真的可能发生吗?我确实看到了但这并不完全适用于此。

答案1

您可以尝试以下操作:

while read
do
  read dir
  read ip
  # Your command using $dir and $ip
done < list.txt

之后read阅读while评论并将其丢弃。

每个read命令从标准输入(在本例中我们从 重定向)读取一行list.txt。有关更详细的说明,请参阅文档

答案2

这可能会有用:

$ awk '(NR-1)%3 {print}' list.txt | xargs -n2 | while read host dir; do echo host=$host dir=$dir; done
host=XXX.XX.XXX.X dir=DIRECTORY-NAME
host=XXX.XX.XXX.X dir=DIRECTORY-NAME
host=XXX.XX.XXX.X dir=DIRECTORY-NAME

代码解释:

  1. 使用 awk 过滤掉注释行,保留剩余部分。grep -v '^#'在这里也可以起作用。
  2. 管道到 xargs,它将把单列备用值重新格式化为两列,第一列是主机,第二列是目录。
  3. 进入 BASH 的 while 循环,将这些值读入独立变量。

警告:第 3 步创建了一个 BASH 子 shell,因此您可能会发现在此之外定义的变量(如您的密码)不可用。对于您来说,解决这个问题的快速方法是改为在子 shell 代码中定义静态密码。话虽如此,您正在export输入密码,所以我想这可以解决这个问题?

https://stackoverflow.com/questions/13726764/while-loop-subshel​​l-dilemma-in-bash有关 BASH 子 shell 的更多信息。

相关内容