linux - shell/bash 编码中的 `&` 和 `#` 是什么意思?请解码 Bash 脚本行

标签 linux bash shell

我是 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]})

请问你能写出最后一行代码的执行步骤流程吗?

最佳答案

我们将了解 $# 的工作原理,然后回答问题。

第 1 部分

${#pattern} 将给出 pattern 所保存的字符串的长度。 因此,在上面的示例中

user@host:~$ echo ${#pattern}
34

因为 34 是字符串 0110011101001101101000010111001001 的长度。

第 2 部分

${pins[$tck]} 用于获取数组 pins 的索引 tck 处的值。如果没有设置该变量,则默认为0。这里,由于没有设置tck${pins[$tck]} 相当于 ${pins[0]}。因此输出将是:

user@host:~$ echo ${pins[$tck]}
2

输出将为 2,因为 bash 中数组索引从 0 开始。

第三部分

$() 用于 bash 中的命令替换。 () 中的命令将被执行,并且输出将被替换。

原始问题

$((2*${#pattern})) 计算结果为 $((2*34)),计算结果为 68

由于tcktditdo未设置,因此默认为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

您需要回显 check_data 函数的结果,该结果将被替换为

checkdatret=YOUR_RESULT_FROM_FUNC

关于linux - shell/bash 编码中的 `&` 和 `#` 是什么意思?请解码 Bash 脚本行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54235442/

相关文章:

C fork() 导致未指定的意外函数调用

bash - Perl Regex Query - 过滤文件中超过 18 个月的内容

linux - 如何在 bash 中创建动态命令?

linux - 使用 Getopts 传递多个强制标志的问题

c++ - 如何在 net-snmp 中打印整数和 Counter32 值

linux - 传出 TCP 端口匹配监听端口

php - 无法从 PHP 向 TMUX session 发送命令

java - 如何编写预提交钩子(Hook)来运行 java 功能测试

linux - GUI 使用 Shell 批处理文件

linux - 我如何从 bash 脚本输入密码?