分页: 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 写了:原来是这样。现在又出现问题了。当文件名含有空格时无效。要怎样改正呢?
最简单的办法,把空格先用特殊字符替换掉,输出时再还原之
发表于 : 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