パラメータを使用して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数字を含み、数字を増減する行が必要です。行に数字がない場合、またはファイルが空の場合はゼロとして扱われます。これは、増分を実行するためにシェル算術評価を使用するよりも優れています。入力値が妥当な値を持つことが保証されていない限り、安全ではありません。

ファイルがあらかじめ存在しない場合は作成(転送3<> "$file")され、まるでゼロを含むかのように処理されます。

同時に実行される2つのインスタンスが同じ古い値を読み取って独立して増やすことができるため、このスクリプトは同時実行に安全ではありません。この問題を解決するには、システムにその機能がある場合は、コマンドを次のように置き換える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'

関連情報