Как улучшить bash-скриптинг, перейдя от одной длинной строки к более качественному методу?

Как улучшить bash-скриптинг, перейдя от одной длинной строки к более качественному методу?

У меня есть скрипт, который открывает терминал и 5 вкладок, выполняет определенную команду и переходит в определенный рабочий каталог.

#!/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"

Сложно поддерживать все в одной строке. Как сделать так, чтобы было легче читать?

я пробовал

#!/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

Пока что это не работает! Я открыт для любых предложений, которые вы можете мне предложить. Я просто хочу изучить и улучшить это.

решение1

Вы можете использовать \его для разделения длинных команд на несколько строк.

Пример:

#!/bin/bash

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

запуск этого скрипта приводит к

$ ./test.sh 

Hello World!
Hello World!

В вашем случае вы можете использовать что-то вроде

#!/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"

решение2

Попробуйте написать \. Тогда оболочка проигнорирует следующую новую строку, и вы сможете написать опции в новой строке.

решение3

Вы можете внести небольшие изменения в свою первоначальную идею с массивами - используйте arrayName[number]="tab assignment" форму. Вот, например, что я сделал в интерактивной терминальной сессии, чтобы открыть новое терминальное окно (и все эти шаги можно легко превратить в скрипт).

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

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

$ gnome-terminal ${array[@]}

Genn Jackman в комментарии правильно заметил, что кавычки могут стать проблемой, особенно если у вас есть несколько сложных команд, как в вашем случае. Таким образом, вы можете рассмотреть возможность разделения информации для вкладки и фактической команды, которую она должна запустить, на два соответствующих массива, каждая запись массива на вкладку. Обратите внимание, что мы хотим использовать cmd[x]как одну целую строку, поэтому заключаем ее в кавычки, в то время как tabinfo[1]has to expand to несколько различных вариантов

Вы также можете рассмотреть возможность помещения имен файлов в переменные, например, VAR=/path/to/fileи использования $VARих для ссылки на них внутри команд вместо создания длинных команд.

#!/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

Связанный контент