Exception Shell provoquée par un espace

大家讲道理
Libérer: 2017-05-28 10:30:13
original
2351 Les gens l'ont consulté

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
Copier après la connexion


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
Copier après la connexion


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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal