新手问个很简单的 Linux 数组读取问题

2018-10-14 02:26:55 +08:00
 DongDongXie
1 aa=(1 3 5 7)
  2 for i in ${aa[@]}
  3 do
  4 echo ${i}+1
  5 done

上面并不是打印出意料中的 2 4 6 8,打印的是 1+1 3+1 这种,没搞懂是为什么,求教!!!

2338 次点击
所在节点    Linux
9 条回复
Allianzcortex
2018-10-14 02:50:33 +08:00
因为 `> echo 1+2` 显示的结果就是 1+2,不会是 3

将第四行改为 `echo ${i}+1|bc`,bc 是 Linux command 下的 math 库

或者改为 `echo $((${i}+1))` 将结果作为一个变量来强制计算求和
iwtbauh
2018-10-14 09:06:42 +08:00
建议标题改为“新手问个很简单的 bash 数组读取问题",此问题和 Linux 无关。bash 可以运行在多种操作系统上,比如 BSD 的衍生版本和 Windows
Vicer
2018-10-14 09:41:55 +08:00
echo $[$i+1]
ik
2018-10-14 09:41:56 +08:00
上面已经回答了, echo $((i+1))
ps1aniuge
2018-10-14 13:13:44 +08:00
`echo $((${i}+1))` 的结果除以 9 得多少呢?
6/9 7/9 567 / 678 都得 0 !

问:为什么不学 shell ?
答:
1shell 太老了。语法上有各种小小的问题。(例如:详见 shell 十三问的 for 篇)
2shell 不是面向对象的,功能不强。
3shell 的正则,学习曲线陡峭。复杂的正则,很容易出错。
实际上 ps 和 py 类似。都是用 [简单的对象方法] ,来实现 [复杂正则] 的功能。但是呢,shell 没有对象,也没有方法。
4 常用外部 shell 命令还是要学,要会的。
5java 在发展,jshell,java12 快出了。
.net 在发展,.net3 快出了。
python 在发展,py37 快完善了。
perl 不怎么发展,排名蹭蹭跌。
bash 和 shell 命令,基本不发展。shell 已经完美了么? shell 中连布尔型变量都没有。


问:如何看待 bash,及 linux shell 脚本将来的地位,命运?
问:powershell 在 linux 中的前景如何?
答:
就好像 [气泵射钉枪] 必将取代 [锤子] 一样,先进生产力必然代替落后的。
就好像面向对象的 powershell,必然取代面向字符的 bat 那样。
powershell 发展成熟后。以 bat,bash 为代表的,上一代面向字符串的脚本语言,面向字符串的命令,难免被边缘化。
过几年后,开机启动脚本,特简单的脚本中,或许还残留有 bat,bash,字符串命令的身影。


问:去哪学 linux 版的 powershell ?
答:
QQ 群号=183173532
名称=powershell 交流群
个人学习 免费。
公司学习 可以收取少许费用,群内远程帮你公司代培训员工。
OpenJerry
2018-10-14 14:05:36 +08:00
@ps1aniuge 长文翻到最后必有推广定律?
owt5008137
2018-10-14 14:25:05 +08:00
echo 那一行改成 echo $(($i+1))
siteshen
2018-10-14 21:37:35 +08:00
# 2.sh 错误
# 1.sh 正确
# https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script

# 错误
$ cat 2.sh aa=(1 3 5 7)
for i in ${aa[@]}
do
echo ${i}+1
done

$ sh -x 2.sh + aa=(1 3 5 7)
+ for i in '${aa[@]}'
+ echo 1+1
1+1
+ for i in '${aa[@]}'
+ echo 3+1
3+1
+ for i in '${aa[@]}'
+ echo 5+1
5+1
+ for i in '${aa[@]}'
+ echo 7+1
7+1



# 正确
$ cat 1.sh aa=(1 3 5 7);
for i in ${aa[@]}; do
echo $(expr ${i} + 1)
done

$ sh -x 1.sh + aa=(1 3 5 7)
+ for i in '${aa[@]}'
++ expr 1 + 1
+ echo 2
2
+ for i in '${aa[@]}'
++ expr 3 + 1
+ echo 4
4
+ for i in '${aa[@]}'
++ expr 5 + 1
+ echo 6
6
+ for i in '${aa[@]}'
++ expr 7 + 1
+ echo 8
8
siteshen
2018-10-14 21:41:06 +08:00
@siteshen `cat (1|2).sh` `sh -x (1|2).sh` 后有换行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/497429

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX