)%20%EC%9D%98%20%EA%B5%AC%EB%AC%B8%EC%9D%84%20%EC%9D%B4%ED%95%B4%ED%95%B4%20%EB%B3%B4%EC%84%B8%EC%9A%94..png)
작업의 기초로 다음 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개의 숫자)을 읽고 모든 숫자를 2x 복사합니다. 여태까지는 그런대로 잘됐다. 하지만 구문이 어떻게 작동하는지 모르겠습니다.
왜 이렇게 표현해야 할까요? 무슨 뜻이에요 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
.