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