[问题]如何调用数组??

sh/bash/dash/ksh/zsh等Shell脚本
头像
woohaha
帖子: 133
注册时间: 2007-07-17 22:09
来自: 广东

[问题]如何调用数组??

#1

帖子 woohaha » 2008-08-24 1:57

我想些一个Script,作用是列出文件夹内所有某一类型文件并把文件名存储到一个数组,以后只要输入序数就输出相应文件名。

下面是我写的程序,错误是无效标识符。我应该怎样改?

代码: 全选

#!/bin/bash
declare -i count
declare -a name
ls *.cue | while read name[$count]
do 
	count=count+1
	echo "[$count] ${name[$count]}"
done
头像
patrickhe
帖子: 681
注册时间: 2005-07-21 19:13
来自: Peking, China
联系:

#2

帖子 patrickhe » 2008-08-24 13:31

代码应该是这样的

代码: 全选

#!/bin/bash
declare -i count=0
declare -a filenames

for filename in `ls *.cue`; do
	filenames[$count]=$filename
	count=$count+1
done

while read n
do
	echo "[$n]: ${filenames[$n]}"
done
头像
woohaha
帖子: 133
注册时间: 2007-07-17 22:09
来自: 广东

#3

帖子 woohaha » 2008-08-24 13:50

解决了,谢谢。

但我想让它先打印一次列表,改成如下代码为什么不成功?

代码: 全选

for filename in `ls *.cue`; do
   filenames[$count]=$filename
   count=$count+1
   echo "[$count]: ${filenames[$count]}"
done
只能这样才可以?

代码: 全选

#!/bin/bash
declare -i count=0
declare -a filenames
declare -i i

for filename in `ls *.cue`; do
   filenames[$count]=$filename
   count=$count+1
done

for(( i=0; i<$count; i=$i+1 ))
do
	echo "[$i]: ${filenames[$i]}"
done
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

#4

帖子 xiooli » 2008-08-24 14:00

woohaha 写了:解决了,谢谢。

但我想让它先打印一次列表,改成如下代码为什么不成功?

代码: 全选

for filename in `ls *.cue`; do
   filenames[$count]=$filename
   count=$count+1
   echo "[$count]: ${filenames[$count]}"
done
[/code]
这样吧,效果是一样的:

代码: 全选

for filename in `ls *.cue`; do
   filenames[$count]=$filename
   count=$count+1
   echo "[$count]: $filename"
done
头像
patrickhe
帖子: 681
注册时间: 2005-07-21 19:13
来自: Peking, China
联系:

#5

帖子 patrickhe » 2008-08-24 14:04

woohaha 写了:解决了,谢谢。

但我想让它先打印一次列表,改成如下代码为什么不成功?

代码: 全选

for filename in `ls *.cue`; do
   filenames[$count]=$filename
   count=$count+1
   echo "[$count]: ${filenames[$count]}"
done
只能这样才可以?

代码: 全选

#!/bin/bash
declare -i count=0
declare -a filenames
declare -i i

for filename in `ls *.cue`; do
   filenames[$count]=$filename
   count=$count+1
done

for(( i=0; i<$count; i=$i+1 ))
do
	echo "[$i]: ${filenames[$i]}"
done
在设置数组的时候直接打印当前处理的 count 和 filename 就可以了。

代码: 全选

for filename in `ls *.cue`; do
   echo "[$count]: $filename"
   filenames[$count]=$filename
   count=$count+1
done
头像
patrickhe
帖子: 681
注册时间: 2005-07-21 19:13
来自: Peking, China
联系:

#6

帖子 patrickhe » 2008-08-24 14:06

woohaha 写了:解决了,谢谢。

但我想让它先打印一次列表,改成如下代码为什么不成功?

代码: 全选

for filename in `ls *.cue`; do
   filenames[$count]=$filename
   count=$count+1
   echo "[$count]: ${filenames[$count]}"
done
echo 语句放错地方了,这时候的 count 已经变化。
头像
woohaha
帖子: 133
注册时间: 2007-07-17 22:09
来自: 广东

#7

帖子 woohaha » 2008-08-24 14:27

原来是这样。现在又出现问题了。当文件名含有空格时无效。要怎样改正呢?
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

#8

帖子 xiooli » 2008-08-24 14:53

woohaha 写了:原来是这样。现在又出现问题了。当文件名含有空格时无效。要怎样改正呢?
最简单的办法,把空格先用特殊字符替换掉,输出时再还原之 :lol:
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

#9

帖子 xiooli » 2008-08-24 14:56

其实生成这个数组还有更简单的方法:

filenames=(`ls *.cue`) 就可以了,要把空格处理掉,不然含空格的文件名会被当成到两个元素。
头像
woohaha
帖子: 133
注册时间: 2007-07-17 22:09
来自: 广东

#10

帖子 woohaha » 2008-08-24 15:26

想过

代码: 全选

ls *.cue|tr ' ' '_'
但是不会它真正改名[/code]
头像
patrickhe
帖子: 681
注册时间: 2005-07-21 19:13
来自: Peking, China
联系:

#11

帖子 patrickhe » 2008-08-24 16:09

这是修改后的代码,可以处理空格。

代码: 全选

declare -a filenames=(`ls *.cue | tr ' ' '_'`)
for i in `seq 0 $((${#filenames[*]} - 1))`; do
        filenames[$i]=${filenames[@]//_/ }
        echo "$i: ${filenames[$i]}"
done
头像
woohaha
帖子: 133
注册时间: 2007-07-17 22:09
来自: 广东

#12

帖子 woohaha » 2008-08-24 23:04

代码: 全选

$ sh -v space.sh
declare -a filenames=(`ls *.cue | tr ' ' '_'`)
space.sh: 1: Syntax error: "(" unexpected
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#13

帖子 eexpress » 2008-08-25 9:13

数组的应用,在bash里面极少。一般是设计者思路不对,才会用数组。
lin下作事情,基本都是小文件处理。
● 鸣学
头像
patrickhe
帖子: 681
注册时间: 2005-07-21 19:13
来自: Peking, China
联系:

#14

帖子 patrickhe » 2008-08-25 9:33

woohaha 写了:

代码: 全选

$ sh -v space.sh
declare -a filenames=(`ls *.cue | tr ' ' '_'`)
space.sh: 1: Syntax error: "(" unexpected
执行一下 sh -version,看一下你用的是 dash 还是 bash。Ubuntu 的 /bin/sh 默认指向的是 dash。
头像
woohaha
帖子: 133
注册时间: 2007-07-17 22:09
来自: 广东

#15

帖子 woohaha » 2008-08-26 13:37

eexpress 写了:数组的应用,在bash里面极少。一般是设计者思路不对,才会用数组。
lin下作事情,基本都是小文件处理。
我做这个脚本是想列出目录里的某一类型文件,再输入编号调用,省去输入文件名。难道有其他更好的办法?
patrickhe 写了:
woohaha 写了:

代码: 全选

$ sh -v space.sh
declare -a filenames=(`ls *.cue | tr ' ' '_'`)
space.sh: 1: Syntax error: "(" unexpected
执行一下 sh -version,看一下你用的是 dash 还是 bash。Ubuntu 的 /bin/sh 默认指向的是 dash。
奇怪的很。

代码: 全选

woohaha@woohaha-laptop:~$ sh -version
sh: Illegal option -r
回复