技术解析

新手问个很简单的 Linux 数组读取问题
0
2021-06-22 07:35:31
idczone
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 这种,没搞懂是为什么,求教!!!


因为 `> echo 1+2` 显示的结果就是 1+2,不会是 3
将第四行改为 `echo ${i}+1|bc`,bc 是 Linux command 下的 math 库
或者改为 `echo $((${i}+1))` 将结果作为一个变量来强制计算求和

建议标题改为“新手问个很简单的 bash 数组读取问题",此问题和 Linux 无关。bash 可以运行在多种操作系统上,比如 BSD 的衍生版本和 Windows

echo $[$i+1]

上面已经回答了, echo $((i+1))

`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 交流群
个人学习 免费。
公司学习 可以收取少许费用,群内远程帮你公司代培训员工。

长文翻到最后必有推广定律?

echo 那一行改成 echo $(($i+1))

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

`cat (1|2).sh` `sh -x (1|2).sh` 后有换行

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服