![Bash 脚本用于从外部列表中的每个项目创建变量并运行命令](https://linux22.com/image/760134/Bash%20%E8%84%9A%E6%9C%AC%E7%94%A8%E4%BA%8E%E4%BB%8E%E5%A4%96%E9%83%A8%E5%88%97%E8%A1%A8%E4%B8%AD%E7%9A%84%E6%AF%8F%E4%B8%AA%E9%A1%B9%E7%9B%AE%E5%88%9B%E5%BB%BA%E5%8F%98%E9%87%8F%E5%B9%B6%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
在我的本地机器上,我有一个文本文件,包含 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
代码解释:
- 使用 awk 过滤掉注释行,保留剩余部分。
grep -v '^#'
在这里也可以起作用。 - 管道到 xargs,它将把单列备用值重新格式化为两列,第一列是主机,第二列是目录。
- 进入 BASH 的 while 循环,将这些值读入独立变量。
警告:第 3 步创建了一个 BASH 子 shell,因此您可能会发现在此之外定义的变量(如您的密码)不可用。对于您来说,解决这个问题的快速方法是改为在子 shell 代码中定义静态密码。话虽如此,您正在export
输入密码,所以我想这可以解决这个问题?
看https://stackoverflow.com/questions/13726764/while-loop-subshell-dilemma-in-bash有关 BASH 子 shell 的更多信息。