
저는 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.5
1e+06
-v OFMT='%.15g'