bash - 在变量 bash 中使用变量
问题描述
嗨,我正在尝试更新名称中包含变量的变量,但无法弄清楚如何:
n=6
tot=5
let abc6xyz="$abc6xyz"+"$tot"
let abc6xyz="$abc6xyz"+"$tot"
echo "abc6xyz $abc6xyz"
# Works fine
let abc${n}xyz="$abc${n}xyz"+"$tot"
echo "abc6xyz $abc6xyz"
++ n=6
++ tot=5
++ let abc6xyz=+5
++ let abc6xyz=5+5
++ echo 'abc6xyz 10'
abc6xyz 10
++ let abc6xyz=6xyz+5
./calc_tots.tst: line 9: let: abc6xyz=6xyz: value too great for base (error token is "6xyz")`enter code here`
++ echo 'abc6xyz 10'
abc6xyz 10
提前谢谢你的帮助。
解决方案
你有几件事对你不利。首先,避免使用let
,这是一个过时的 shell 特性。而是使用 POSIX 算术((...))
。
接下来,$abc${n}xyz
扩展为$abc
(未定义)并且${n}xyz
是"6xyz"
或不是十进制,八进制或十六进制,因此它对于基数来说太大了。
在 bash 中使用 POSIX 算术,您可以更改脚本,合并((...))
为:
#!/bin/bash
n=6
tot=5
abc6xyz="$tot"
((abc6xyz+=tot)) ## use arithmetic operators ((..))
echo "abc6xyz $abc6xyz"
((abc${n}xyz+=tot)) ## then use indirection, e.g. ${!foo}
echo "abc6xyz $abc6xyz"
示例使用/输出
$ bash -x /tmp/tmp-david/bashindir.sh
+ n=6
+ tot=5
+ abc6xyz=5
+ (( abc6xyz+=tot ))
+ echo 'abc6xyz 10'
abc6xyz 10
+ (( abc6xyz+=tot ))
+ echo 'abc6xyz 15'
abc6xyz 15
添加间接或final=$((...))
在您解释的评论中,您希望将数字作为n=
脚本的第一个参数(位置参数)包含在内。在这种情况下,要在所有添加后访问总值,请使用间接或分配$((...))
.
例如,使用间接:
#!/bin/bash
((abc${1}xyz+=5))
((abc${1}xyz+=5))
foo="abc${1}xyz"
echo "abc${1}xyz: ${!foo}"
示例使用/输出
$ bash -x /tmp/tmp-david/redir.sh 6
+ (( abc6xyz+=5 ))
+ (( abc6xyz+=5 ))
+ foo=abc6xyz
+ echo 'abc6xyz: 10'
abc6xyz: 10
或者最好只分配最后一个算术运算的结果,例如
#!/bin/bash
((abc${1}xyz+=5))
final=$((abc${1}xyz+=5))
echo "abc${1}xyz: $final"
示例使用/输出
$ bash -x /tmp/tmp-david/assign.sh 6
+ (( abc6xyz+=5 ))
+ final=10
+ echo 'abc6xyz: 10'
abc6xyz: 10
推荐阅读
- python - 如何将包含多行的单元格的数据框行转换为单独的列
- excel - 您可以在 Excel 中创建自定义错误类型吗?
- python - 我得到“TypeError:列表索引必须是整数或切片,而不是 str”。我如何解决它?
- mysql - 无法读取未定义的属性“getAllProducts”
- r - 对新数据使用预测时出错 - 因子具有新水平
- amazon-web-services - Cloudwatch:用于监控 S3 文件的事件类型语法
- android - FFmpeg 将音频从麦克风编码为 mp3 在颤动中飞行
- node.js - AWS S3 上传的图像已部分加载
- php - Laravel 将时间戳保存为 DateTime - SQLSTATE [22007]:无效的日期时间格式:1292 不正确的日期时间值:
- javascript - 将数组传递给回调