ファイル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 $var
File1
File1
File1
1行の内容で上書きするには、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パーサーを使用します(例yq
:https://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