您可以使用bash索引數組來創建配置文件。
server[1]=1
type[1]=openvz
ip[1]=1.1.1.1
port[1]=22
user[1]=root
pwd[1]=something
rpath[1]=/home/private/
lpath[1]=s1/
server[2]=2
type[2]=openvz
ip[2]=1.1.1.2
port[2]=22
user[2]=root
pwd[2]=something
rpath[2]=/home/private/
lpath[2]=s2/
然後遍歷就可以了。
source serverlist
for i in $(seq ${#server[@]}); do
sshpass -p ${pwd[$i]} rsync -av --delete ${user[$i]}@${ip[$i]}:${rpath[$i]} /home/backup/${lpath[$i]}
done
希望它有幫助。
更新
如果你希望能夠指定要在命令行上同步的服務器,使用猛砸位置參數$1
。
source serverlist
if [ "$1" ]; then
sshpass -p ${pwd[$1]} rsync -av --delete ${user[$1]}@${ip[$1]}:${rpath[$1]} /home/backup/${lpath[$1]}
else
for i in $(seq ${#server[@]}); do
sshpass -p ${pwd[$i]} rsync -av --delete ${user[$i]}@${ip[$i]}:${rpath[$i]} /home/backup/${lpath[$i]}
done
fi
然後,使用可選的服務器編號作爲第一個參數來調用腳本。
./script.sh # This would sync all servers in the config file.
./script.sh 2 # This would sync only server number 2.
您可以使用getopt的,但它要複雜得多。
更新2
如果您需要使用getopt的,那麼腳本的rsync的一部分轉換成一個bash函數。
source serverlist
function do_sync() {
if [ "$1" ]; then
sshpass -p ${pwd[$1]} rsync -av --delete ${user[$1]}@${ip[$1]}:${rpath[$1]} /home/backup/${lpath[$1]}
else
for i in $(seq ${#server[@]}); do
sshpass -p ${pwd[$i]} rsync -av --delete ${user[$i]}@${ip[$i]}:${rpath[$i]} /home/backup/${lpath[$i]}
done
fi
}
然後,您可以調用與getopt的選項作爲參數,這種功能。
do_sync $getopt_option
我想添加另一個函數:如果在shell中沒有給出任何選項,那麼serverlist應該從serverlist中取出。但是如果make(例如)./aa.sh -r 3那麼只有第3項將從serverlist中使用。 我知道如何使用getopts,但是如何在$(seq $ {#server [@]})中修改 ;做 只有在沒有給出身份證的情況下才會打電話? – user2933212