bash スクリプトを 1 行の長いものからより良い方法に改善するにはどうすればよいですか?

bash スクリプトを 1 行の長いものからより良い方法に改善するにはどうすればよいですか?

ターミナルを開いて 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"

すべてを 1 行にまとめるのは、維持するのが困難です。読みやすくするには、どうすればよいでしょうか?

私はもう試した

#!/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 はコメントで、特にあなたの場合のように難しいコマンドが複数ある場合は、引用符が問題になる可能性があることに適切に気付いていました。したがって、タブの情報と、タブごとに各配列エントリを持つ 2 つの対応する配列に実行する必要がある実際のコマンドを分割することを検討してください。1cmd[x]つの文字列全体として使用したいので引用符で囲みますが、tabinfo[1]複数の異なるオプションに展開する必要があります。

長いコマンドを使用する代わりに、ファイル名を や などの変数に配置して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

関連情報