Похоже, у вас проблемы с массивами $ {team_two [*]}
и $ {team_two [k1]}
, либо вы испортили символы разделения в специальная переменная $ IFS
. Вы можете включить отладку Bash, добавив set -x
перед входом во внешний цикл for. А затем отключите его с помощью set + x
, чтобы получить более подробные сведения.
set -x
... for loop block ...
set +x
Когда я запускаю ваш код через Bash таким образом, я получаю следующий результат:
$ bash -x for.bash
++ seq 1 5
+ for i1 in '`seq 1 5`'
+ num1=2
++ seq 2 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=1
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=2
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=3
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=4
+ for i1 in '`seq 1 5`'
+ num1=3
++ seq 3 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=6
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=7
+ for i1 in '`seq 1 5`'
+ num1=4
++ seq 4 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=8
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=9
+ for i1 in '`seq 1 5`'
+ num1=5
++ seq 5 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=10
+ for i1 in '`seq 1 5`'
+ num1=6
++ seq 6 5
После дальнейших обновлений будет казаться, что вы сбросили $ IFS
. Обычно вы хотите сохранить $ IFS
во вторичной переменной перед ее сбросом, а позже вернуть ее к исходному значению.
IFSOLD=$IFS
IFS=,
... do IFS , stuff here ...
IFS=$IFSOLD
Если вы попробуете эти примеры, они могут пролить дополнительный свет на влияние, которое $ IFS
может сыграть при использовании в скрипте.
Допустим, у меня есть следующая переменная:
$ var="1,2,3,4,5"
Теперь давайте проанализируем ее и распечатаем первую переменную, $ c1
:
$ IFS=',' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1
Однако если мы изменим наш $ IFS
на космос.
$ IFS=' ' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1,2,3,4,5
Итак, во втором примере мы настроили команду read
через $ IFS
для разделения по пробелам, а не по запятым.
У меня была такая же проблема, и после огромного количества попыток я нашел следующее решение
gnome-terminal -- bash -c "myCommand -some-args; bash"
gnome-terminal -- bash -c "myOtherCommand -some-args; bash"
Лучший способ, ИМХО, это забыть о терминале gnome -. Вместо этого установите терминал mate -, который является клоном старого терминала gnome -, и он сохраняет такие полезные функции, как возможность называть вкладки...
Вот мой сценарий запуска, который создает три именованные вкладки, каждая из которых может находиться в разных каталогах...
#!/bin/bash
mate-terminal \
--hide-menubar \
--geometry=130x12+1+800 \
--tab -t "vpn" \
--tab -t "home" \
--tab --working-directory="/ddr/buppo/bw/bw-b/sn" -t "sn"
Немного жаль, что терминал gnome -устарел -e
. Это усложняет запуск экземпляра с несколькими вкладками с разными командами. Вот мой подход:
Где-то на своем пути я создаю исполняемый launch_project_foo
скрипт.Типичный файл запуска проекта может выглядеть как:
#!/bin/bash
BASE_DIR=~/git/ProjectFooBaseDir
cat << EOF > /tmp/bootstrap_tabs.sh
gnome-terminal --tab -t "Docker" --working-directory="$BASE_DIR/backend" -- \
zsh -is eval "docker-compose up"
gnome-terminal --tab -t "Backend" --working-directory="$BASE_DIR/backend" -- \
zsh -is eval "npm start"
gnome-terminal --tab -t "Frontend" --working-directory="$BASE_DIR/frontend" -- \
zsh -is eval "npm start"
gnome-terminal --tab -t "Git" --working-directory="$BASE_DIR"
EOF
gnome-terminal --window --maximize -- bash /tmp/bootstrap_tabs.sh
Важно :Это зависит от наличия ловушки eval в .zshrc
, как объяснено ниже.
Несколько замечаний:
Основной вызов gnome-terminal
фактически создает «нулевую» вкладку для начальной загрузки, но, поскольку она сразу же закрывается, это не заметно. Если вы поместите сон в сценарий начальной загрузки, вы поймете, что я имею в виду.
Чтобы разрешить подстановку переменных, в heredoc не должны использоваться заключенные в кавычки 'EOF'
, см. использование переменных внутри bash heredoc .
Последняя вкладка создает обычный терминал для нормальной работы.
Другие вкладки не запускают процессы напрямую, потому что это будет означать, что если процесс завершится, вкладка исчезнет. Решение этой проблемы несколько специфично для оболочки. Здесь я использую zsh и полагаюсь на наличие хука eval в .zshrc
. Можно избежать хука eval и просто использовать, например. zsh -ic "<commands>; zsh -i"
. Однако у этого есть недостаток, заключающийся в том, что при уничтожении команд с помощью CTRL + C
(, что характерно для бесконечно работающих команд, таких как npm start
), вся вкладка будет закрыта, потому что экземпляр внешней оболочки завершает работу. Подход с хуком eval позволяет избежать этого и позволяет держать вкладки открытыми даже в случае SIGTERM.
Команды могут быть объединены в цепочку, как обычно, и на практике я часто использую sleep 10; npm start;
, чтобы дождаться готовности чего-то с другой вкладки (, например docker -compose ).
открывает несколько вкладок. я думаю, что будет чище держать каждую вкладку на отдельной строке. если вы хотите новое окно для каждого, опустите--tab
обратите внимание, что большая разница с --
по сравнению с -e
/ --command
заключается в том, что аргументы не заключены в кавычки
gnome-terminal --title "Frontend Web App" --tab --working-directory ~/projects/front-end-app -- npm run serve
gnome-terminal --title "API Server" --tab --working-directory ~/projects/api-server --./run-local.sh