Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >Shell-Ausnahme, verursacht durch ein Leerzeichen
Kürzlich habe ich mithilfe der Shell ein Skript „replace.sh“ geschrieben, um das f-Server-Programm zu sichern und zu ersetzen. Die ursprüngliche Absicht bestand darin, Arbeitskräfte und sich wiederholende mechanische Arbeit zu sparen. Während des Drehbuchschreibprozesses wurde aufgrund von Fahrlässigkeit ein zusätzliches Leerzeichen eingegeben und es kam zu einer unerwarteten Situation.
1. Schauen Sie sich zunächst die problematische Datei replace.sh an
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
Führen Sie das Skript aus und die Ergebnisse sind wie folgt:
Ich habe ein zusätzliches Leerzeichen eingegeben und dann bash replace.sh das Skript ausgeführt und etwas Unerwartetes ist passiert: 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}.bakErgebnis nach Ersetzen der Variable) Der Befehl wurde tatsächlich ausgeführt ! Meine ursprüngliche Absicht besteht darin, mit Echo zu überprüfen, ob die Befehlskombination korrekt ist, aber dieser Befehl wird nicht ausgeführt. Warum passiert das?
Um das Problem herauszufinden, können Sie das Skript über bash -x replace.sh ausführen . Die Option „-x“ bewirkt, dass die Shell jede Befehlszeile anzeigt, die sie während der Ausführung des Skripts tatsächlich ausführt, und ein „+“-Zeichen am Anfang der Zeile anzeigt. Was nach dem „+“-Zeichen angezeigt wird, ist der Inhalt der Befehlszeile nach der Variablenersetzung, was hilfreich ist, um zu analysieren, welcher Befehl tatsächlich ausgeführt wird. Die Option „-x“ ist einfach und bequem zu verwenden und kann die meisten Shell--Debugging--Aufgaben problemlos bewältigen. Sie sollte als erste Wahl für das Debuggen angesehen werden. Führen Sie bash -x replace.sh aus, die Ergebnisse sind wie folgt:
Es ist ersichtlich, dass Zeile 10 in replace.sh in 2 Befehle aufgeteilt ist (insgesamt 2 Befehle im gelben Feld und im roten Feld), also ssh $host $bak ${hostPath }/$file ${hostPath}/${file}.bak wird ausgeführt. Entfernen Sie als Nächstes die zusätzlichen Leerzeichen in Zeile 10 und sehen Sie sich den Effekt an.
2. Normale replace.sh
Listing 2: 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" ##先备份目标机器上的脚本,去除了多余的空格,此时第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
Die laufenden Ergebnisse lauten wie folgt:
Achten Sie daher beim Schreiben von Shell-Skripten besonders auf Leerzeichen.
Das obige ist der detaillierte Inhalt vonShell-Ausnahme, verursacht durch ein Leerzeichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!