bashを使用してファイルの内容値に1を追加するには?

bashを使用してファイルの内容値に1を追加するには?

このbashスクリプトを作成しましたが、うまくいきません。

dex=`date +%Y%m%d`

if [ -f "bv$dex.txt" ]; 

then
eval bv$dex=`cat ./bv$dex.txt`
let bv$dex+=1 ;
echo $bv$dex > ./bv$dex.txt

else
echo 1 > ./bv$dex.txt

fi

何らかの理由で、ファイルに数値+1の代わりに変数dexを書き込みます。

答え1

他の人が言ったように、ファイル名でより単純な変数名を使用すると、これを回避できますcounter=$(cat "bv$(date +%Y%m%d)")

しかし、これがうまくいかない理由を知りたい場合は、問題は次のとおりです。

echo $bv$dex > ./bv$dex.txt

このコマンドは、とを2つの別々の式としてecho $bv$dex評価し、結果を連結します。注は未定義のため(空の文字列)*と評価されます。したがって、これは日付を印刷するのと同じです。$bv$dex$bv""echo $dex

代わりにあなたは欲しいでしょう

eval echo \$bv$dex > ./bv$dex.txt

たとえばdex=20211228、式は変数参照ではなくリテラルとして扱われるため、リテラル\$bv$dex文字列として評価されます。したがって、コマンドは期待される結果を生成します。$bv20211228\$$evalecho $bv20211228

可能であっても良い考えではありません:)

set -u*スクリプトの上部に追加すると、空の文字列として評価するのではなく、評価時に失敗します。set -eushebangの後にスクリプトの最初の行として追加することをお勧めします#!/bin/bash

答え2

提供されたコードによると、日付がわかってもファイル名が変更されないようです。

変数名がファイルのデフォルト名と一致する場合、利点はありません。

#.. Create the full filename.
printf -v Fn 'bv%(%Y%m%d)T.txt' -1

#.. Create or fetch the serial number.
Num=0
[[ -r "${Fn}" ]] && read -r Num < "${Fn}"

#.. Write the incremented serial.
printf > "${Fn}" '%d\n' $(( ++Num ))

関連情報