我正在编写一个 bash 脚本来使用 rsync 并更新大约 20 个不同服务器上的文件。
我已经弄清楚了 rsync 部分。我遇到的麻烦是查看变量列表。
到目前为止,我的脚本如下所示:
#!/bin/bash
SERVER1="192.xxx.xxx.2"
SERVER2="192.xxx.xxx.3"
SERVER3="192.xxx.xxx.4"
SERVER4="192.xxx.xxx.5"
SERVER5="192.xxx.xxx.6"
SERVER6="192.xxx.xxx.7"
for ((i=1; i<7; i++))
do
echo [Server IP Address]
done
哪里[Server IP Address]
应该是相关变量的值。所以当 i = 1 时,我应该回显 $SERVER1 的值。
我已经尝试了几次迭代,包括
echo "$SERVER$i" # printed the value of i
echo "SERVER$i" # printer "SERVER" plus the value of i ex: SERVER 1 where i = 1
echo $("SERVER$i") # produced an error SERVER1: command not found where i = 1
echo $$SERVER$i # printed a four digit number followed by "SERVER" plus the value of i
echo \$$SERVER$i # printed "$" plus the value of i
自从我编写脚本以来已经有很长时间了,所以我知道我错过了一些东西。另外,我确信我正在混合使用 C# 可以做的事情,我在过去 11 年中一直在使用它。
我想要做的甚至可能吗?或者我应该将这些值放在一个数组中并循环遍历该数组?对于生产 IP 地址和位置名称,我需要同样的事情。
这一切都是为了不必重复我将用来同步远程服务器上的文件的代码块。
使用数组。
正如其他答案所指出的,数组是最方便的方法。但是,为了完整起见,您所要求的确切内容是间接扩展。重写如下,您的示例也将使用此方法工作:
如果您可以将 IP 地址列表放入
for
循环中,那么您也可以考虑简单地使用一些大括号扩展来迭代您需要的任何内容:但是,如果您需要重用(可能是大括号扩展的)列表,那么使用该列表来初始化数组将是可行的方法:
虽然我自己可能会选择其中一个数组答案,但我想指出可以直接循环遍历名称。你可以做
或者,在 4.3 及更高版本中,您可以使用
nameref
:< 4.3 解决方案的帽子提示ilkkachu。
每个说你应该使用数组的人都是正确的,但是——作为一个学术练习——如果你决定用以数字结尾的单独变量(SERVER1、SERVER2 等)来做,这就是你要做的它: