文件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
已经具有一些(整数)值。
解释问题的另一种方法是,您想要读取var
form的值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