我需要使用以下 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
。