매개변수를 사용하여 txt 파일의 숫자를 늘리거나 줄이는 Bash 스크립트

매개변수를 사용하여 txt 파일의 숫자를 늘리거나 줄이는 Bash 스크립트

저는 Linux를 처음 접했고 현재 bash 스크립트를 작업하고 있습니다. 현재 작업은 스크립트와 매개변수의 도움으로 +1 또는 -1을 사용하여 파일의 값을 늘리거나 줄여야 합니다.

txt 파일에 대해서는 이 작업을 수행할 수 있다고 생각합니다.

  • 파일의 값에 1을 더합니다.
    ./script.sh in
    
  • 파일의 값을 1씩 감소시킵니다.
    ./script.sh out
    

누구든지 올바른 접근 방식을 지적하고 예나 해결책을 제시할 수 있다면 크게 감사하겠습니다.

답변1

다음에서 값을 읽고, 증분하고, 새 값을 쓰고 awk, 매개변수 처리를 수행 할 수 있습니다 sh.

#! /bin/sh -
file=/path/to/counter
case "$#:$1" in
   (1:in) incr=1;;
  (1:out) incr=-1;;
      (*) echo >&2 'need "in" or "out" as the one and only one argument'
          exit 1
esac

awk -v incr="$incr" '
  {print $0 + incr > FILENAME; exit}
  END {if (!NR) print incr > FILENAME}' 3<> "$file" "$file"

$file숫자를 포함하고 숫자를 늘리거나 줄이는 행이 필요합니다 . 줄에 숫자가 없거나 파일이 비어 있으면 0으로 처리됩니다. 이는 증분을 수행하기 위해 쉘 산술 평가를 사용하는 것보다 낫습니다.입력값이 합리적인 값을 갖는다고 보장되지 않으면 안전하지 않습니다..

파일이 미리 존재하지 않으면 생성(전달 3<> "$file")되어 마치 0을 포함하는 것처럼 처리됩니다.

동시에 실행되는 두 인스턴스가 동일한 이전 값을 읽고 독립적으로 증가시킬 수 있으므로 이 스크립트는 동시 실행에 안전하지 않습니다. 이 문제를 해결하려면 시스템에 해당 기능이 있는 경우 명령을 다음으로 바꿀 flock수 있습니다 .awk

{
  flock 3 &&
    awk -v incr="$incr" '
    {print $0 + incr > FILENAME; exit}
    END {if (!NR) print incr > FILENAME}' "$file"
} 3<> "$file"

여기서 flock파일에 대한 독점 잠금을 얻습니다.


1 숫자는 정수 또는 부동 소수점일 수 있습니다(일부 awk 구현 및 일부 환경에서는 16진수로 표시될 수도 있음). 그러나 정수가 아닌 숫자는 6자리 정밀도로 표시되므로 증분 후에는 99999.5합계 가 됩니다 100000. 따라서 부동 소수점 숫자와 높은 값을 처리하는 경우 정밀도를 높이기 위해 인스턴스를 추가할 수 있습니다.999999.51e+06-v OFMT='%.15g'

관련 정보