如何将 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

尝试用写作来表达\。然后 shell 会忽略下一个新行,您可以在新行中写入选项。

答案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]必须扩展到几个不同的选项

您可能还需要考虑将文件名放入变量中,例如VAR=/path/to/file和 using$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

相关内容