Récemment, j'ai utilisé Shell pour écrire un script replace.sh pour sauvegarder et remplacer le programme du serveur f. L'intention initiale était d'économiser de la main d'œuvre et du travail mécanique répétitif. Au cours du processus d'écriture du scénario, par négligence, un espace supplémentaire a été saisi et une situation inattendue s'est produite.
1. Jetez d'abord un œil au replace.sh problématique
Liste 1 : replace.sh
1 #!/bin/sh 2 file="mv.sh" #日志清理脚本 3 bak="mv" 4 replace="scp" 5 hostPath="/data/kuyin_new/musicsearch/bin/logs" 6 #hostList=(172.16.72.50 172.16.72.56 172.16.72.58 172.16.72.76 172.16.72.78 172.16.72.96 172.16.72.98) 7 hostList=(172.16.72.50) 8 for host in ${hostList[*]} 9 do10 bakCmd= "ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak" #先备份目标机器上的脚本,这里=之后多打了一个空格11 echo $bakCmd #这里先打印一下bakCmd命令,看一下12 #bash -c "$bakCmd"13 #replaceCmd="$replace $file ${host}:${hostPath}" #拷贝至目标机器14 #finalCmd="${bakCmd} ; ${replaceCmd}"15 #echo $replaceCmd16 #echo $finalCmd17 #bash -c "$finalCmd"18 done
Exécutez le script, et les résultats sont les suivants :
J'ai tapé un espace supplémentaire, puis bash replace.sh a exécuté le script, et quelque chose d'inattendu s'est produit : ssh 172.16.72.50 mv /data/kuyin_new/musicsearch/bin/logs/mv.sh /data/kuyin_new/musicsearch/bin/logs/mv.sh.bak (ssh $host $ bak ${hostPath }/$file ${hostPath}/${file}.bakRésultat après remplacement de la variable) La commande a été effectivement exécutée ! Mon intention initiale est d'utiliser echo pour vérifier si la combinaison de commandes est correcte, mais cette commande ne sera pas exécutée. Alors pourquoi cela arrive-t-il ?
Afin de découvrir le problème, vous pouvez exécuter le script via bash -x replace.sh . L'option "-x" amène le shell à afficher chaque ligne de commande qu'il exécute réellement lors de l'exécution du script, et à afficher un signe "+" au début de la ligne. Ce qui est affiché après le signe "+" est le contenu de la ligne de commande après la substitution de variable, ce qui est utile pour analyser quelle commande est réellement exécutée. L'option "-x" est simple et pratique à utiliser, et peut facilement gérer la plupart des tâches de débogage du shell. Elle doit être considérée comme le premier choix pour le débogage. Exécutez bash -x replace.sh, les résultats sont les suivants :
On peut voir que la ligne 10 de replace.sh est divisée en 2 commandes (un total de 2 commandes dans la case jaune et la case rouge), donc ssh $host $bak ${hostPath }/$file ${hostPath}/${file}.bak sera exécuté. Ensuite, supprimez les espaces supplémentaires sur la ligne 10 et voyez l'effet.
2. Remplacement normal.sh
Liste 2 : remplacer.sh
1 #!/bin/sh 2 file="mv.sh" #日志清理脚本 3 bak="mv" 4 replace="scp" 5 hostPath="/data/kuyin_new/musicsearch/bin/logs" 6 #hostList=(172.16.72.50 172.16.72.56 172.16.72.58 172.16.72.76 172.16.72.78 172.16.72.96 172.16.72.98) 7 hostList=(172.16.72.50) 8 for host in ${hostList[*]} 9 do10 bakCmd="ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak" ##先备份目标机器上的脚本,去除了多余的空格,此时第10行就是一个命令11 echo $bakCmd12 #bash -c "$bakCmd"13 #replaceCmd="$replace $file ${host}:${hostPath}" #拷贝至目标机器14 #finalCmd="${bakCmd} ; ${replaceCmd}"15 #echo $replaceCmd16 #echo $finalCmd17 #bash -c "$finalCmd"18 done
Les résultats d'exécution sont les suivants :
Par conséquent, portez une attention particulière aux espaces lors de l'écriture de scripts shell.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!