分页: 1 / 2

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

发表于 : 2008-08-24 1:57
woohaha
我想些一个Script,作用是列出文件夹内所有某一类型文件并把文件名存储到一个数组,以后只要输入序数就输出相应文件名。

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

代码: 全选

#!/bin/bash
declare -i count
declare -a name
ls *.cue | while read name[$count]
do 
	count=count+1
	echo "[$count] ${name[$count]}"
done

发表于 : 2008-08-24 13:31
patrickhe
代码应该是这样的

代码: 全选

#!/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

发表于 : 2008-08-24 13:50
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

发表于 : 2008-08-24 14:00
xiooli
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

发表于 : 2008-08-24 14:04
patrickhe
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

发表于 : 2008-08-24 14:06
patrickhe
woohaha 写了:解决了,谢谢。

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

代码: 全选

for filename in `ls *.cue`; do
   filenames[$count]=$filename
   count=$count+1
   echo "[$count]: ${filenames[$count]}"
done
echo 语句放错地方了,这时候的 count 已经变化。

发表于 : 2008-08-24 14:27
woohaha
原来是这样。现在又出现问题了。当文件名含有空格时无效。要怎样改正呢?

发表于 : 2008-08-24 14:53
xiooli
woohaha 写了:原来是这样。现在又出现问题了。当文件名含有空格时无效。要怎样改正呢?
最简单的办法,把空格先用特殊字符替换掉,输出时再还原之 :lol:

发表于 : 2008-08-24 14:56
xiooli
其实生成这个数组还有更简单的方法:

filenames=(`ls *.cue`) 就可以了,要把空格处理掉,不然含空格的文件名会被当成到两个元素。

发表于 : 2008-08-24 15:26
woohaha
想过

代码: 全选

ls *.cue|tr ' ' '_'
但是不会它真正改名[/code]

发表于 : 2008-08-24 16:09
patrickhe
这是修改后的代码,可以处理空格。

代码: 全选

declare -a filenames=(`ls *.cue | tr ' ' '_'`)
for i in `seq 0 $((${#filenames[*]} - 1))`; do
        filenames[$i]=${filenames[@]//_/ }
        echo "$i: ${filenames[$i]}"
done

发表于 : 2008-08-24 23:04
woohaha

代码: 全选

$ sh -v space.sh
declare -a filenames=(`ls *.cue | tr ' ' '_'`)
space.sh: 1: Syntax error: "(" unexpected

发表于 : 2008-08-25 9:13
eexpress
数组的应用,在bash里面极少。一般是设计者思路不对,才会用数组。
lin下作事情,基本都是小文件处理。

发表于 : 2008-08-25 9:33
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。

发表于 : 2008-08-26 13:37
woohaha
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