2012-09-08 11 views
10

私は毎時crontabで実行するbashスクリプトを作成しました。次に実行するときにアクセスできるように、変数を1つ保存する必要があります。スクリプトは実行するたびに変数を変更するので、私はそれをハードコードすることはできません。今はtxtファイルに書き出してからそれを読み返しています。これよりも良い方法がありますか?そして、私がtxtファイルを読んでいるところは、私がここで見つけたものです、私はそれを理解していない、それはちょっとやっかいです。このためのコマンドはありませんか?とにかく、適切なコードがあります。読みやすいように変数のいくつかが変更されています。bash - 実行間に変数を格納するためのより良い方法はありますか?

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

# Do some stuff, change var to a new value 

echo $var > var.txt 

変数は1つの整数なので、テキストファイルは過度の使用感を感じます。

+1

永続的なデータを保持する短いテキストファイルはまさにその方法です。 – user4815162342

答えて

6

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 

キーは、次のツー最後の行は、exitコマンドも持っているので、何もそれが実行されます後。最後の行は、永続化したい変数の値です。スクリプトが実行されるとき、それはそれ自身の最後の行からのreadです。終了する前に、sedを使用して、自身のコピーを一時ファイルに書き込みます。最後の行は、永続的な値の現在の値で変更されています。次に、現在のスクリプトを一時ファイルで上書きします(これを行う権限があると仮定します)。

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

+0

ありがとう、それはずっと簡単です。これを行うにはテキストファイルが最善の方法ですか? – shardbearer

+0

@shardbearer:それは依存しています。ファイル、データベース、その他のエキゾチックなjava/ruby​​/pythonオブジェクト・パーシスタンス・ストアから選択したり、プログラムを無限ループで実行したり(適切なスリープ時間を埋め込んだ状態)、全体的な必要条件あります。通常、ファイルの永続性は十分です。何千ものファイルとディレクトリを持つmongoシステムに入っている場合(最近、S.O.でここに掲げられているように)、適切な技術を見つけるためにしばらく時間を費やす必要があります。皆さんお元気で。 – shellter

+0

Downvoter:あなたの理由をコメントしてください。それは嫌な自己修正コードのためか? :) – chepner

1

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(一番最初の点)。しかし、それはそこに '出口'を持ってはならないと私はこれがcronで動作するかどうかわからない...

-1

私は次のことを終えた。 1つのファイル内の変数を好むでしょうが、コードをわずかに膨らませます。これはどのように読み取られますか?複数の変数を別々のファイル、たとえばvariables.txtに格納しておき、main.shというメインプログラムを作成することができます。変数の読み込みと保存のために別々のスクリプトを書くほうが良いでしょう。 varibles.txtについては

A=0 
B=0 
C=0 

main.shの場合:

#!/bin/bash 

#reload variables 
A=`cat ./variables.txt|grep "A="|cut -d"=" -f2` 
B=`cat ./variables.txt|grep "B="|cut -d"=" -f2` 
C=`cat ./variables.txt|grep "C="|cut -d"=" -f2` 

#print variables 
printf "$A\n" 
printf "$B\n" 
printf "$C\n" 

#update variables 
A=$((($A+1))) 
B=$((($B+2))) 
C=$((($C+3))) 

#save variables to file 
#for A 
#remove entry for A 
cat ./variables.txt|grep -v "A=">>./tmp.txt 
#save entry for A 
printf "A=$A\n">>./tmp.txt 
#move tmp.txt to variables.txt 
mv ./tmp.txt ./variables.txt 

#for B 
#remove entry for B 
cat ./variables.txt|grep -v "B=">>./tmp.txt 
#save entry for B 
printf "B=$B\n">>./tmp.txt 
#move tmp.txt to variables.txt 
mv ./tmp.txt ./variables.txt 

#for C 
#remove entry for C 
cat ./variables.txt|grep -v "C=">>./tmp.txt 
#save entry for C 
printf "C=$C\n">>./tmp.txt 
#move tmp.txt to variables.txt 
mv ./tmp.txt ./variables.txt 
+2

違反はありませんが、これはひどいです。自分で解析するのではなく、 'variables.txt'ファイルを'ソース 'したほうがよいでしょう。その上、無用な猫の使用が目撃された! –

2

私は、これは古い質問です知っています。しかし、セッション間でenvarsをシリアライズする方法を模索するためにここに来た他の人に役立つことを願って、私はまだここに自分のソリューションを投稿することに決めました。

"var_name = var_value"をファイルに書き込むだけです(例: "./environ")。そして、次のセッションでは "source ./envrion"を入力します。たとえば、次のように

echo "var1=$var1" > ./environ 

より包括的な変数のすべての属性を永続化の方法は、「-p宣言」を利用することである(そしてエレガント?):

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

その後、ソース」の後に。/envrion "とすると、その値に加えてすべての属性がリストアされたvar1 var2を取得できます。これは、配列、整数などを扱うことができることを意味します。

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

sed -i 's/^declare\(-g\)*/declare -g/' ./environ 
# "\(-g\)?" ensure no duplication of "-g" 
+0

これは簡単な方法ですが、私はそれを自分で使います。信頼できないユーザがソースファイルの完全な機能を含んでいるため、(例えば '/ tmp'の中で最初に作成されたものではない場合)信頼できないユーザがファイルに書き込むことができるならば、注意が必要です。世話をする! –

+0

@TobySpeightあなたは正しいです、ありがとうございます。 –

関連する問題