タスクの基礎として、次の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ファイルを同時に読み取り、操作し、出力を新しいファイル名で保存することです。マルチスレッドは、セマフォと一緒に使用され、2つのスレッドへの並列アクセスを正確に使用します(この部分はPython 3.7で別々のコードスニペットで書かれています)。
私はそれが何である"$lockdir1"
かを知っていると思います。これは絶対パスのプレースホルダのように見え、スクリプトに直接入力すると問題を引き起こす可能性があります。その目的は、操作されるファイルのコピーを保持する一時ディレクトリを作成するようです。
2> /dev/null
エラーメッセージを直接削除してエラーメッセージを抑制するために使用できます。
rm -r
また明確です。ファイル(およびその内容)の操作が成功した後、一時ファイルは削除され、他のスレッドが作業を続行できるようにし、デッドロック(ディレクトリが保持されている場合に発生する可能性がmkdir
あります"Error"
)を防ぎます。
難しい部分は理解することですecho $(($1 * 2))
。私はそれが何をしているのか既に知っていると思います。おそらくCSVファイルの内容(それぞれ整列していない100個の数字)を読み、すべての数字を2回コピーします。今まではそんなに良くなった。しかし、構文がどのように機能するのかわかりません。
なぜこのように表現するのですか?どういう意味ですかecho &
?下の部分がパラメータとして渡されることを意味しますか?正確にはどういう意味ですか(())
?ある種のループがあればもっと理解できますが、これは単なる条件(if/then/else/)です。しかし、私たちの課題では、このスクリプトを使用して各CSVファイルの100個の数字をすべて2倍にする必要があります。
おそらく私の割り当てが間違っているので、ループを直接書く必要があるかもしれませんが(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
。