Что подразумевается под `& amp;` и `#` в кодировке shell / bash? Пожалуйста, расшифруйте строку сценария Bash

Для этого вам не нужны 2 отладчика. Вы можете использовать тот же отладчик для отладки обоих. Просто убедитесь, что ваше решение содержит оба проекта и просто поместите свои точки останова там, где они вам нужны

-1
задан Umair 17 January 2019 в 11:57
поделиться

4 ответа

Вставьте свой код в 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.

Скорее всего, это поможет увидеть остальную часть кода и узнать, что именно вам нужно.

0
ответ дан Paul Hodges 17 January 2019 в 11:57
поделиться

Попробуйте проанализировать код шаг за шагом, вставив некоторые выходные команды

echo $pattern
echo ${#pattern}
echo $((2*${#pattern}))
echo $tck
echo ${pins[$tck]}
# ...
0
ответ дан Bodo 17 January 2019 в 11:57
поделиться

Не видя, что вы используете в качестве входных данных для сценария или всего этого, довольно сложно дать точное описание.

Однако:

# 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[@]}
0
ответ дан itChi 17 January 2019 в 11:57
поделиться

Посмотрим, как работает $, #, а затем ответим на вопрос.

Часть 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

0
ответ дан Akhil Mohan 17 January 2019 в 11:57
поделиться