尝试理解 echo $(($1 * 2)) 的语法

尝试理解 echo $(($1 * 2)) 的语法

我需要使用以下 bash 脚本作为作业的基础。

#!/bin/bash
lockdir1=/tmp/.myscript.lock1
lockdir2=/tmp/.myscript.lock2

if mkdir "$lockdir1" 2> /dev/null
then
    rm -r "$lockdir1"
    echo $(($1 * 2))
    exit
elif mkdir "$lockdir2" 2> /dev/null
then
    echo $(($1 * 2))
    rm -r "$lockdir2"
    exit
else
    echo "Error"
    rm -r "$lockdir1"
    rm -r "$lockdir2"
    pkill calc.sh
    exit
fi

基本功能是同时读取和操作多个现有 CSV 文件,并将输出保存在新文件名下。多线程与信号量一起使用,以允许并行访问恰好两个线程(这部分将在 Python 3.7 中编写为单独的代码段)。

我想我知道它的"$lockdir1"作用 - 它看起来像是绝对路径的占位符,如果直接在脚本中输入,可能会引起麻烦。看起来它的目的是创建临时目录,用于保存将要操作的文件的副本。

2> /dev/null可能用于通过直接丢弃错误消息来抑制错误消息。

rm -r也很清楚:在成功操作文件(及其内容)后,临时文件将被删除,以便其他线程可以继续其业务,以防止死锁(如果目录保留,mkdir将导致"Error"一直)。

棘手的部分是要理解echo $(($1 * 2))- 我想我已经知道它的作用:它可能读取 CSV 文件的内容(每个 100 个未排序的数字),将所有数字复制 2 倍。到目前为止一切顺利。但我不知道语法是如何工作的。

为什么一定要这样表达呢?这是什么echo &意思?是否表明下面的部分将作为参数传递?到底是什么意思(())- 如果存在某种循环,对我来说更有意义,但这只是一个条件(if/then/else/)。但在我们的作业中,我们需要使用此脚本将每个 CSV 文件中的所有 100 个数字加倍。

也许我的分配错误,我们需要自己编写循环(使用 Python 3.7),但如果我准确理解echo $(($1 * 2))语法的工作原理,我仍然会有更安全的感觉。

答案1

该语法$(( [...] ))用于执行整数数学运算。

$ echo $(( 2 + 2 ))
4
$ foo=5
$ echo $(( $foo + 2 ))
7
$ echo $(( $foo / 2 ))
2
$ echo $(( $foo % 2 ))
1

在您的情况下,您的脚本正在使用$1,它在展开时计算为第一个参数,因此如果您的脚本使用./script.sh 43,$1调用,则计算结果为43,因此$(( $1 * 2))计算结果为86

相关内容