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

Я новичок в программировании Bash. Я пытаюсь понять следующий код.

Я знаю только, что $ используется для передачи параметров.

function check_data () {
  local pattern=$1 iterations=$2 tck=$3 tdi=$4 tdo=$5
  ...
}

pattern="0110011101001101101000010111001001"

pins=(2 3 4 17 27 22)

# tck, tdi, and tdo are integer number

checkdatret=$(check_data $pattern $((2*${#pattern})) ${pins[$tck]} ${pins[$tdi]} ${pins[$tdo]})

Пожалуйста, вы можете написать последовательность шагов выполнения последней строки кода?

Ответы [ 4 ]

0 голосов
/ 17 января 2019

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

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

Теперь функция будет вызываться с параметрами

$1=0110011101001101101000010111001001
$2=68
$3=2
$4=2
$5=2

Вам необходимо echo результат из функции check_data, который будет заменен на

checkdatret=YOUR_RESULT_FROM_FUNC

0 голосов
/ 17 января 2019

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

Тем не менее:

# 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 голосов
/ 17 января 2019

Вставьте свой код в 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 голосов
/ 17 января 2019

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

echo $pattern
echo ${#pattern}
echo $((2*${#pattern}))
echo $tck
echo ${pins[$tck]}
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...