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개의 숫자)을 읽고 모든 숫자를 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.

관련 정보