ファイルを上書きして標準出力にエコーします。

ファイルを上書きして標準出力にエコーします。

数値を増やしてファイルに保存する単純なbash関数があります。

get_next_int (){
   my_file="$HOME/next_int.json"
   touch "$my_file"
   typeset -i my_num=$(cat "$my_file")
   echo "$((++my_num))" > "$my_file" | tee
}

このラインについて:

echo "$((++my_num))" > "$my_file" | tee

疑問に思って、増加する整数でファイルを上書きし、それをstdoutにエコーする方法はありますか?

Tシャツへのこの答えは私の状況を扱っていないようです。

出力をファイルとstdoutにリダイレクトする方法スタックオーバーフロー|

また、この行については次のとおりです。

typeset -i my_num=$(cat "$my_file")

ファイルから文字列の整数表現を取得します。ただし、ファイルが空の場合、デフォルト値は1に設定する必要があります。

次の方法はありますか?

typeset -i my_num=$(cat "$my_file" | default "1")

ベストアンサー1

echo "$(( ++my_num ))" | tee "$my_file"

デフォルトでは、Teeは名前付きファイルを標準出力に書き込みます。

後でtypeset -i my_num=$(cat "$my_file")(おそらくそれtypeset -i my_num=$(<"$my_file")以降bash)使用することができます

my_num=$(( my_num == 0 ? 1 : my_num ))

値が0の場合は1に設定します。空の場合、整数変数はbashゼロと評価されます。

以前は提案しますがmy_num=${my_num:-1}、整数変数なのでmy_num空であれば空の文字列ではなく 0 に拡張されます。これは、パラメータ置換${variable:-value}が機能しないことを意味します(そうでなければvalue変数が設定されないか、空の場合は拡張されます。空です)。


この関数を次のように書くこともできます。

get_next_int () {
    local -i val
    read val <"$HOME/next_int.json"
    val=$(( val == 0 ? 1 : val ))
    printf "%d\n" "$(( val + 1 ))" | tee "$HOME/next_int.json"
}

"$HOME/next_int.json"常に単一の整数が含まれているとします。touchファイルの変更タイムスタンプが更新されるため、省略しますteetouchアクセスタイムスタンプも更新する必要がある場合はそのままにしてください)。

おすすめ記事