更新另一个文件中的变量

更新另一个文件中的变量

文件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

我想从 File2 更改 File1,以便可以将值加 10。将 File2 末尾的结果从 10 更改为 20。

我对所有解决办法持开放态度。我正在尝试为《龙与地下城》创建一个角色表,用于跟踪我的生命值等。

答案1

请注意,您的sed命令正在尝试替换echo $var中的文本File1,但您刚刚显示File1不包含这样的行。

File1要用一行内容覆盖var=20,请使用

echo 'var=20' >File1

File1使用单行将值赋给$((var + 10))变量进行覆盖var,请使用

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

或者

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

在上面的最后一个示例中,我们通过此处文档执行操作,该文档在使用重定向形式写入文件之前由当前 shell 展开cat

最后两个变体假设变量var已经具有一些(整数)值。


解释问题的另一种方法是,您想要读取varform的值File1,然后简单地打印该值并添加 10。你会这样做

#!/bin/sh

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

.命令是用于获取另一个文件的标准命令。该source命令特定于bash其他一些 shell,但工作原理(几乎)相同。

您可能还想测试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 角色表包含​​更多值,并且您想单独更新它们,那么我可能不会将该表保留为我源的 shell 文件。相反,我会使用 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

一个比上面更简单的变体,它不提供任何丰富的结构化文档格式,使用 shellbash及其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

相关内容