他のファイルの変数の更新

他のファイルの変数の更新

ファイル1は

var=10

ファイル2は

source File1

echo $var     #this displays 10 if I ran the shell. 

ここに何がありますか? sedコマンドで変数を使用できるため、sedを操作できません。

$ sed -i ‘s/echo $var/var=$((var+10))/‘ File1`

私は他のすべての組み合わせを試しました。私はこれが悪いコードであることを知っていますが、それを説明するより良い理由はありません。

source File1

echo $var # I want this to display 20

値に10を加えることができるように、File1をFile2から変更したいと思います。 File2 末尾の結果を 10 から 20 に変更します。

私はすべてのソリューションで開いています。私の健康などを追跡するDungeons and Dragons用のキャラクターシートを作成しようとしています。

答え1

コマンドはのテキストをsed置き換えようとしますが、表示された行にはそのような行は含まれていません。echo $varFile1File1

File11行の内容で上書きするには、var=20次を使用します。

echo 'var=20' >File1

1行で上書きするために変数にFile1値を割り当てるには、次のようにします。$((var + 10))var

printf 'var=%s\n' "$((var + 10))" >File1

または

cat >File1 <<END
var=$((var + 10))
END

上記の最後の例では、リダイレクトされたフォームを使用してファイルに書き込まれる前に、現在のシェルによって拡張されたドキュメントで作業していますcat

最後の2つのバリアントでは、変数varにすでにいくつかの(整数)値があると想定しています。


var問題を説明する別の方法は、フォームの値を読み取り、単にFile1値を印刷して10を加算することです。あなたはこれを行います

#!/bin/sh

. ./File1
printf '%s\n' "$((var + 10))"

この.コマンドは、別のファイルをインポートする標準コマンドです。このsourceコマンドは他の一部のシェルにのみ適用されますが、bashほぼ同じように機能します。

var変数が実際に設定されているかどうかをテストし、そうでない場合は診断メッセージを出力することもできます。

#!/bin/sh

. ./File1

if [ "${var+set}" = set ]; then
    printf '%s\n' "$((var + 10))"
else
    echo 'The variable "var" is not set' >&2
fi

D&D 文字テーブルに多くの値が含まれていて、個別に更新したい場合は、テーブルを私のソースのシェルファイルとして保持しません。代わりに、YAMLやTOMLなどを使用して統計を保存し、YAMLまたはTOMLパーサーを使用します(例yqhttps://kislyuk.github.io/yq/)これらの統計を読み、更新します。

YAMLの文字テーブル:

characters:
  - name: Bard the cleric
    class: Cleric
    level: 45
    hp: 3
    backstory: >
      Bard was born in a small village
      east of the Great Lake.
      Etc.
  - name: Cleric the ranger
    class: Ranger
    level: 35
    hp: 5

その後、一部のスクリプトでは

# Add 5 to "Cleric the ranger"'s hp (does in-place editing)
yq -y --in-place '.characters[] | select(.name == "Cleric the ranger").hp += 5' sheet.yml

豊富な構造文書形式を提供しない上記のより単純な変形は、シェルとそのbash機能declare -pを使用してファイルに保存する変数を作成します。

#!/bin/bash

source ./character  # contains variables hp and name

printf 'HP = %s\n' "$hp"

# change hp and write back to file
hp=$(( hp + 10 ))

declare -p hp name >./character

実行後のファイルはcharacter次のようになります。

declare -- hp="15"
declare -- name="Ranger the warrior"

(最初からそうだったらhp)。5ファイルが完全に破損しているため、変更した変数だけでなく、すべての変数をファイルに書き込む必要があります。

答え2

あなたはこれを試すことができますsed

ファイル1

$ cat file_1
var=10

ファイル2

$ cat file_2
source file_1
sed -i "s/$var/$((var + 10))/" file_1
source file_1
echo "$var"

出力

$ ./file_2
20

$ cat file_1
var=20

関連情報