2017-01-20 18 views
0

bashスクリプトで変数内の数値をインクリメントする必要があります。 しかし、スクリプトが実行された後、変数は新しい番号でエクスポートされ、スクリプトが次に実行されるときに利用可能になります。bashスクリプトのインクリメント数(変数)

IN MY SHELL 

    set x=0 

SCRIPT 

" If something is true.. do" 
export x=$(($x+1)) //increment variable and save it for next time 
if [ $x -eq 3 ];then 
    echo test 
fi 
exit 
+1

永続変数は*ファイル*と呼ばれます。状態をファイルに保存して読み戻します。例えば。 'echo $ x"> myfile'を使用して 'x = $(cat myfile)'を使用して保存する –

答えて

2

次の2つのプロセス間でのメモリ内の変数を保持することはできません。その値はどこかに格納し、次の起動時に読み取る必要があります。これを行う最も簡単な方法はファイルです。 (普遍的な変数をサポートするシェルは、新しいシェルを起動して終了するときに常に通信する別のプロセスを使用しますが、この「マスター」プロセスでもファイルを使用して値を保存する必要があります)終了)。

# Ensure that the value of x is written to the file 
# no matter *how* the script exits (short of kill -9, anyway) 
x_file=/some/special/file/somewhere 
trap 'printf '%s\n' "$x" > "$x_file"' EXIT 

x=$(cat "$x_file") # bash can read the whole file with x=$(< "$x_file") 
# For a simple number, you only need to run one line 
# read x < "$x_file" 
x=$((x+1)) 
if [ "$x" -eq 3 ]; then 
    echo test 
fi 
exit 
+0

ありがとう、私のために働いた:) – tso

0

変数のエクスポートは片道のみです。エクスポートされた変数は、シェルのすべての子プロセスに対して正しい値を持ちますが、子プロセスが終了すると、変更された値は親プロセスに対して失われます。実際、親プロセスは変数の初期値のみを表示します。

これは良いことです。 すべて子プロセスは、エクスポートされた変数の値を変更する可能性があります(値を変更すると双方向になる可能性があります)。

次の2つのいずれかを実行できます。

  • は、ファイルからそれを読んで、スクリプトが終了する前に、ファイルに値を保存しており、 使用source your-script.bashまたは. your-script.bash
  • を開始するとき。この方法では、 シェルは子プロセスを作成せず、変数が変更されます。 同じプロセス
関連する問題