数値を増やしてファイルに保存する単純な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
ファイルの変更タイムスタンプが更新されるため、省略しますtee
(touch
アクセスタイムスタンプも更新する必要がある場合はそのままにしてください)。