Wie kann man Bash-Skripting von einer langen Zeile zu einer besseren Methode verbessern?

Wie kann man Bash-Skripting von einer langen Zeile zu einer besseren Methode verbessern?

Ich habe ein Skript, das das Terminal öffnet, fünf Registerkarten öffnet, einen bestimmten Befehl ausführt und zu einem bestimmten Arbeitsverzeichnis geht.

#!/bin/sh

gnome-terminal --tab --title="Zookeeper" --profile Hold -e "sh -c '/home/kafka_2.11-0.8.2.2/bin/zookeeper-server-start.sh /home/kafka_2.11-0.8.2.2/config/zookeeper.properties'" --tab --title="Kafka" --profile Hold -e "sh -c 'sleep 5; /home/kafka_2.11-0.8.2.2/bin/kafka-server-start.sh /home/kafka_2.11-0.8.2.2/config/server.properties'" --tab --title="APP-Binaries" --profile Hold --working-directory="/home/app-binaries" --tab --title="APP-DB" --profile Hold --working-directory="/home/prod/db"

Es ist schwierig, alles in einer Zeile zu haben. Wie kann ich es besser machen, damit es leichter zu lesen ist?

ich habe es versucht

#!/bin/sh

Tab=""

Tab+=("--tab --title='Zookeeper' --profile Hold -e 'sh -c /home/kafka_2.11-0.8.2.2/bin/zookeeper-server-start.sh /home/kafka_2.11-0.8.2.2/config/zookeeper.properties'")
Tab+=( "--tab --title='Kafka' --profile Hold -e 'sh -c 'sleep 5; /home/kafka_2.11-0.8.2.2/bin/kafka-server-start.sh /home/kafka_2.11-0.8.2.2/config/server.properties'")
Tab+=(" --tab --title='APP-Binaries' --profile Hold --working-directory='/home/app-binaries'")
Tab+=(" --tab --title='APP-DB' --profile Hold --working-directory='/home/prod/db'")
    
# echo "${Tab[@]}"
    
gnome-terminal "${Tab[@]}"
    
exit 0

Bisher funktioniert es noch nicht! Ich bin offen für alle Vorschläge, die ihr für mich habt. Ich möchte einfach lernen und es verbessern.

Antwort1

Sie können verwenden \, um lange Befehle auf mehrere Zeilen aufzuteilen.

Beispiel:

#!/bin/bash

echo "Hello World!"
echo \
"Hello World!"

Das Ausführen dieses Skripts führt zu

$ ./test.sh 

Hello World!
Hello World!

In Ihrem Fall können Sie so etwas verwenden wie

#!/bin/bash    

gnome-terminal \
--tab --title="Zookeeper" --profile Hold -e "sh -c '/home/benu/Downloads/kafka_2.11-0.8.2.2/bin/zookeeper-server-start.sh /home/benu/Downloads/kafka_2.11-0.8.2.2/config/zookeeper.properties'" \
--tab --title="Kafka" --profile Hold -e "sh -c 'sleep 5; /home/benu/Downloads/kafka_2.11-0.8.2.2/bin/kafka-server-start.sh /home/benu/Downloads/kafka_2.11-0.8.2.2/config/server.properties'" \
--tab --title="SSC" --profile Hold -e "sh -c 'sleep 15; cd ~/gitnewssc/benu-ssc-binaries; ./startSSC.sh'" --working-directory="/home/benu/gitnewssc/benu-ssc-binaries" \
--tab --title="SSC-Binaries" --profile Hold --working-directory="/home/benu/gitnewssc/benu-ssc-binaries" \
--tab --title="SSC-DB" --profile Hold --working-directory="/home/benu/SSC-V2/ssc-db"

Antwort2

Versuchen Sie es mit writing \. Dann ignoriert die Shell die nächste neue Zeile und Sie können Optionen in eine neue Zeile schreiben.

Antwort3

Sie können Ihre ursprüngliche Idee mit Arrays geringfügig ändern – verwenden Sie arrayName[number]="tab assignment" das Formular. Hier sehen Sie beispielsweise, was ich in einer interaktiven Terminalsitzung getan habe, um ein neues Terminalfenster zu öffnen (und alle diese Schritte könnten problemlos in ein Skript umgewandelt werden).

$ array[0]=" --tab --title 'Tab1' -e vi"                       

$ array[1]=" --tab --title 'Tab1' -e byobu"                    

$ gnome-terminal ${array[@]}

Genn Jackman hat in seinem Kommentar richtig bemerkt, dass Anführungszeichen ein Problem darstellen können, insbesondere wenn Sie wie in Ihrem Fall mehrere schwierige Befehle haben. Daher sollten Sie die Informationen für die Registerkarte und den eigentlichen Befehl, der ausgeführt werden muss, in zwei entsprechende Arrays aufteilen, wobei jeder Array-Eintrag pro Registerkarte erfolgt. Beachten Sie, dass wir cmd[x]als eine ganze Zeichenfolge verwenden möchten, daher in Anführungszeichen setzen, während tabinfo[1]in mehrere verschiedene Optionen erweitert werden muss

Möglicherweise möchten Sie auch Dateinamen in Variablen wie platzieren VAR=/path/to/fileund diese verwenden, $VARum innerhalb von Befehlen auf diese zu verweisen, anstatt lange Befehle zu verwenden.

#!/bin/bash

function main()
{
   local cmd[1]="sh -c 'df;free;bash'"
   local cmd[2]="sh -c 'lsblk;cat /etc/fstab;bash'"
   local tabinfo[1]="--tab 'TAB1' --profile CRT -e"
   local tabinfo[2]="--tab 'TAB2'"
   gnome-terminal  ${tabinfo[1]} "${cmd[1]}" ${tabinfo[2]} "${cmd[2]}"
}

main

verwandte Informationen