この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
\$
$
eval
echo $bv20211228
可能であっても良い考えではありません:)
set -u
*スクリプトの上部に追加すると、空の文字列として評価するのではなく、評価時に失敗します。set -eu
shebangの後にスクリプトの最初の行として追加することをお勧めします#!/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 ))