關于獲取數組最後一個元素 in bash --有什麽高招嗎?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

關于獲取數組最後一個元素 in bash --有什麽高招嗎?

#1

帖子 naturalaw » 2011-11-24 9:07

這是zsh的寫法.

代码: 全选

fname=John
lname=Doe
age=25
person=($fname $lname $age)
for x in ${person[@]};do 
[ $x = ${person[${#person[@]}]} ] && echo "$x" || echo -n "$x ";
done
bash 代碼

代码: 全选

fname=John
lname=Doe
age=25
person=($fname $lname $age)
sub=`expr ${#person[@]} - 1`
for x in ${person[@]};do 
[ $x = ${person[$sub]} ] && echo "$x" || echo -n "$x ";
done
bash,數組下標打0開始,數組長度 = 最後一個元素下標 - 1;
而zsh是打1開始,數組長度 = 最後一個元素下標.
bash似乎要多走一步. 求解.
  • The eternal law
头像
kingkongmok
帖子: 340
注册时间: 2006-03-23 14:48

Re: 關于獲取數組最後一個元素 in bash --有什麽高招嗎?

#2

帖子 kingkongmok » 2011-11-24 10:27

不明白为何楼主要这样实现,以下可否?

代码: 全选

arrays=(a b c)

for (( ITERA=0; ITERA<${#arrays[@]}; ITERA+=1 )); do
    echo  ${arrays[$ITERA]} 
done
最后一个元素,可以这样吧……

代码: 全选

echo ${arrays[$((${#arrays[@]} - 1 ))]}
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 關于獲取數組最後一個元素 in bash --有什麽高招嗎?

#3

帖子 eexpress » 2011-11-24 13:17

为什么不用perl。既然你bash zsh混用,有兼容问题。就应该选高级一层的方法。
● 鸣学
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 關于獲取數組最後一個元素 in bash --有什麽高招嗎?

#4

帖子 naturalaw » 2011-11-24 13:55

kingkongmok 写了:不明白为何楼主要这样实现,以下可否?

代码: 全选

arrays=(a b c)

for (( ITERA=0; ITERA<${#arrays[@]}; ITERA+=1 )); do
    echo  ${arrays[$ITERA]} 
done
最后一个元素,可以这样吧……

代码: 全选

echo ${arrays[$((${#arrays[@]} - 1 ))]}
我也想這樣啊.可就是不行.我早試過了,所以才得用變量的.
echo ${arrays[$((${#arrays[@]} - 1 ))]}
bash: arrays: 坏的数组下标
  • The eternal law
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 關于獲取數組最後一個元素 in bash --有什麽高招嗎?

#5

帖子 naturalaw » 2011-11-24 13:56

eexpress 写了:为什么不用perl。既然你bash zsh混用,有兼容问题。就应该选高级一层的方法。
好吧.先走完這一步.下一步,我學習perl了.
  • The eternal law
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 關于獲取數組最後一個元素 in bash --有什麽高招嗎?

#6

帖子 fnan » 2011-11-24 19:22

naturalaw 写了:
kingkongmok 写了:不明白为何楼主要这样实现,以下可否?

代码: 全选

arrays=(a b c)

for (( ITERA=0; ITERA<${#arrays[@]}; ITERA+=1 )); do
    echo  ${arrays[$ITERA]} 
done
最后一个元素,可以这样吧……

代码: 全选

echo ${arrays[$((${#arrays[@]} - 1 ))]}
我也想這樣啊.可就是不行.我早試過了,所以才得用變量的.
echo ${arrays[$((${#arrays[@]} - 1 ))]}
bash: arrays: 坏的数组下标
#arrys数组不存在,当然不能用下标,不过还有方法:
echo ${a[@]: -1}
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 關于獲取數組最後一個元素 in bash --有什麽高招嗎?

#7

帖子 naturalaw » 2011-11-25 0:36

echo ${a[@]: -1}
这个用法.好.但是从哪里有参考资料呢.没看到过哦.搜索过,只见过一些用法.
3.特殊使用
分片:

[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ echo ${a[@]:0:3}
1 2 3
[chengmo@centos5 ~]$ echo ${a[@]:1:4}
2 3 4 5

[chengmo@centos5 ~]$ c=(${a[@]:1:4})
[chengmo@centos5 ~]$ echo ${#c[@]}
4
[chengmo@centos5 ~]$ echo ${c[*]}
2 3 4 5

直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。
#输出数组中下标大于2的元素
echo ${array[@]:2}
不曾见过你提的这个用法.
是不是这样解释.
${a[@]: -1}
-1表示倒数第一个,-2表示倒数第一和倒数第二个.
空格的作用是让它和前面的用法 ${array[@]:2} 区分开?
  • The eternal law
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 關于獲取數組最後一個元素 in bash --有什麽高招嗎?

#8

帖子 fnan » 2011-11-25 1:30

kose3@kose3-laptop:~$ a=(1a 2b 3c)
kose3@kose3-laptop:~$ echo ${a[@]: -2}
2b 3c
kose3@kose3-laptop:~$ echo ${a[@]: -2:1}
2b
#教程没详细的,变通着用啊。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 關于獲取數組最後一個元素 in bash --有什麽高招嗎?

#9

帖子 naturalaw » 2011-11-25 10:06

fnan 写了:kose3@kose3-laptop:~$ a=(1a 2b 3c)
kose3@kose3-laptop:~$ echo ${a[@]: -2}
2b 3c
kose3@kose3-laptop:~$ echo ${a[@]: -2:1}
2b
#教程没详细的,变通着用啊。
好吧.
空格+負數(倒數):長度
正數:長度
${数组名[@或*]:起始位置:长度}
  • The eternal law
回复