Для этого вам не нужны 2 отладчика. Вы можете использовать тот же отладчик для отладки обоих. Просто убедитесь, что ваше решение содержит оба проекта и просто поместите свои точки останова там, где они вам нужны
Вставьте свой код в shellcheck.net
function check_data () {
local pattern=$1 iterations=$2 tck=$3 tdi=$4 tdo=$5
...
}
Не используйте оба function
и ()
. Предпочитаю ()
.
check_data() {
local pattern=$1 iterations=$2 tck=$3 tdi=$4 tdo=$5
...
}
local
определяет переменные в функции как область действия этой функции. $1
и таковы значения позиционных параметров, которые получает функция.
pattern="0110011101001101101000010111001001"
Это просто простая строка.
pins=(2 3 4 17 27 22)
Это присвоило перечисленные целые числа в качестве значений в стандартном массиве. ${pins[0]
равно 2, ${pins[1]
равно 3 и т. Д. До ${pins[5]
из 22.
checkdatret=$(...)
Выполняет подоболочку и назначает из нее стандартный вывод $checkdatret
.
check_data val1 val2 val3 val4 val5
Выполняет функцию, присваивает оценочное значение каждому аргументу, поэтому -
check_data $pattern $((2*${#pattern})) ${pins[$tck]} ${pins[$tdi]} ${pins[$tdo]}
передает в 0110011101001101101000010111001001
(значение глобальной переменной $pattern
) в функцию значение $ 1 , который присваивается локальной переменной $pattern
.
$2
получает 68 для присвоения в iterations
, потому что ${#pattern}
- это длина $pattern
, которая равна 34; $(( ... ))
получает замену арифметической оценкой его содержания, которая является 2*${#pattern}
.
Я должен предположить, что tck
, tdi
и tdo
также имеют глобальные версии, поскольку локальные версии внутри функции здесь будут недоступны. Я также должен предположить, что у каждого есть значение в диапазоне 0-5, поскольку каждый используется в качестве индекса для ссылки на одно из шести значений в pins
.
Скорее всего, это поможет увидеть остальную часть кода и узнать, что именно вам нужно.
Попробуйте проанализировать код шаг за шагом, вставив некоторые выходные команды
echo $pattern
echo ${#pattern}
echo $((2*${#pattern}))
echo $tck
echo ${pins[$tck]}
# ...
Не видя, что вы используете в качестве входных данных для сценария или всего этого, довольно сложно дать точное описание.
Однако:
# Var = how many characters in the variable
${#pattern} # 34 characters
echo ${#pattern}
34
Я не вижу в вашем коде "&"
?
check_data
- это вызов функции, а все остальное - аргументы, предоставленные check_data
# This is an array and $tck is supposed to represent a "Key"
${pins[$tck]}
# You can list keys with ${pins[@]}
Посмотрим, как работает $
, #
, а затем ответим на вопрос.
Часть 1
${#pattern}
даст длину строки, которую содержит pattern
. Поэтому в приведенном выше примере
user@host:~$ echo ${#pattern}
34
, поскольку 34 - это длина строки 0110011101001101101000010111001001
.
Часть 2
${pins[$tck]}
используется для получения значения по индексу tck
массива pins
. Если переменная не установлена, то по умолчанию она будет равна 0. Здесь, поскольку tck
не установлено, ${pins[$tck]}
эквивалентно ${pins[0]}
. Таким образом, выходные данные будут:
user@host:~$ echo ${pins[$tck]}
2
Выходные данные будут равны 2, поскольку индексирование массива начинается с 0 в bash.
Часть 3
$()
используется для подстановки команд в bash. Команда внутри ()
будет выполнена, а вывод будет заменен.
Первоначальный вопрос
$((2*${#pattern}))
заменяется на $((2*34))
, который заменяется на 68
Поскольку tck
, tdi
и tdo
не установлено, по умолчанию будет 0. Поэтому
${pins[$tck]}
оценивается как ${pins[0]}
, что равно 2
, первому элементу в массиве pins
.
Аналогично, ${pins[$tdi]}
и ${pins[$tdo]}
оба равны 2
Поэтому последняя строка в вашем скрипте теперь,
checkdatret=$(check_data 0110011101001101101000010111001001 68 2 2 2)
Теперь функция будет вызываться с параметрами [ 1147]
$1=0110011101001101101000010111001001
$2=68
$3=2
$4=2
$5=2
Вам необходимо echo
результат из функции check_data
, который будет заменен на
checkdatret=YOUR_RESULT_FROM_FUNC