23

crontab を使用して 1 時間ごとに実行する bash スクリプトを作成しました。次に実行するときにアクセスできるように、1 つの変数を保存する必要があります。スクリプトは実行するたびに変数を変更するため、ハードコードすることはできません。現在、txt ファイルに書き込んでから読み戻しています。これよりも良い方法はありますか?そして、私がtxtファイルを読んでいる方法は、私がここで見つけたものです.私はそれを理解していません.それはちょっと不格好です. このための組み込みコマンドはありませんか?とにかく、読みやすくするためにいくつかの変数を変更した適用可能なコードを次に示します。

while read x; do
  var=$x
done < var.txt

# Do some stuff, change var to a new value

echo $var > var.txt

変数は 1 つの整数のみであるため、テキスト ファイルは過剰に感じられます。

4

7 に答える 7

19

使用する必要はありませんvar; x現在のシェルのスコープになります。あるいは、

read var < var.txt
# do stuff with var
echo $var > var.txt

単純なテキスト ファイルを使用して変数を格納することをお勧めします。ただし、自己変更スクリプトという (非常に疑わしい) オプションがあります。娯楽目的のみ!

#!/bin/bash

read val < <( tail -n 1 "$0" )

(( val++ ))
echo "$val"

tmp=$(mktemp /tmp/XXXXXXX)
sed '$s/.*/'$val'/' "$0" > "$tmp"
mv "$tmp" "$0"

exit
0

重要なのは、最後から2番目の行を終了コマンドにすることです。そのため、それ以降は何も実行されません。最後の行は、保持する変数値です。スクリプトが実行されると、それread自体の最後の行から始まります。終了する前に、それsed自体のコピーを一時ファイルに書き込み、最後の行を永続値の現在の値で変更します。次に、現在のスクリプトを一時ファイルで上書きします (そうする権限があると仮定します)。

しかし、真剣に?これをしないでください。

于 2012-09-08T21:18:44.497 に答える
6

私はこれが古い質問であることを知っています。ただし、セッション間で環境変数をシリアル化する方法を探してここに来る他の人に役立つことを期待して、ここに私のソリューションを投稿することにしました。

簡単な方法は、「var_name=var_value」を「./environ」などのファイルに書き込むだけです。そして、次のセッションで「source ./envrion」。例えば:

echo "var1=$var1" > ./environ

変数のすべての属性を永続化するより包括的 (かつ洗練された?) 方法は、"declare -p" を使用することです。

declare -p var1 var2 > ./environ
# NOTE: no '$' before var1, var2

後で、「source ./envrion」の後に、その値に加えてすべての属性が復元された var1 var2 を取得できます。これは、配列、整数などを処理できることを意味します。

ただし、「declare -p xx」に関する注意点が 1 つあります。「source ./environ」を関数にラップすると、デフォルトで「declare」が変数をローカル変数として宣言するため、すべてのソース変数が関数内でのみ表示されます。これを回避するには、任意の関数から (または「メイン」関数で) 「ソース化」するか、./environ を変更して宣言の後に「-g」を追加します (対応する変数をグローバルにします)。例えば:

sed -i 's/^declare\( -g\)*/declare -g/' ./environ
# "\( -g\)?" ensure no duplication of "-g"
于 2015-11-18T12:42:19.643 に答える
3

1-変数が1つしかないため、スクリプトを簡素化できます

var=`cat var.txt`
# Do some stuff, change var to a new value   
echo $var > var.txt

2-変数を環境に保存できます:

export var

# Do some stuff, change var to a new value

ただし、プロンプトを表示する必要があります. script.ksh(冒頭のドット)。しかし、そこに「exit」が含まれているべきではなく、これがcronで機能するかどうかはわかりません...

于 2012-09-08T21:20:39.790 に答える