如何读取当前目录的文件列表并且写入数组[已解决]3楼正解

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
ghostry
帖子: 1532
注册时间: 2008-07-23 20:08
来自: http://www.ghostry.cn
联系:

如何读取当前目录的文件列表并且写入数组[已解决]3楼正解

#1

帖子 ghostry » 2010-05-01 11:58

我想写一个功能,和这个py实现的一样(这段代码是用来写自动变幻的背景的,但是不知道为什么,我无法成功执行这段代码提示如此: 没有那个文件或目录)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Name: slidexml.py
# Author: EthanZ6174
# Email: <[email protected]>
# Site: http://www.noslog.com
# Licence: GPLv3
# Version: 091127

import glob, os
import shutil
import time


curdir = os.getcwd()
os.chdir(curdir)
currentFilelist = glob.glob('*.*')
currentImageFiles = glob.glob('*.jpg')

currentTime = time.localtime()
length = len(currentImageFiles)

for i in currentFilelist:
if i == 'backgroundslide.xml':
os.remove(i)

f = file('backgroundslide.xml', 'w')

f.write('<background>\n')
f.write('\t<starttime>\n')
f.write('\t\t<year>' + str(currentTime.tm_year) + '</year>\n')
f.write('\t\t<month>' + str(currentTime.tm_mon) + '</month>\n')
f.write('\t\t<day>' + str(currentTime.tm_mday) + '</day>\n')
f.write('\t\t<hour>' + str(currentTime.tm_hour) + '</hour>\n')
f.write('\t\t<minute>' + str(currentTime.tm_min) + '</minute>\n')
f.write('\t\t<second>' + str(currentTime.tm_sec) + '</second>\n')
f.write('\t</starttime>\n')
f.write('<!--This animation will start at the time it created-->\n')

for i in currentImageFiles:
length = length - 1

f.write('\t<static>\n')
f.write('\t\t<duration>595.0</duration>\n')
f.write('\t\t<file>' + curdir + '/' + currentImageFiles[length] +'</file>\n')
f.write('\t</static>\n')
if length >= 1:
f.write('\t<transition>\n')
f.write('\t\t<duration>5.0</duration>\n')
f.write('\t\t<from>' + curdir + '/' + currentImageFiles[length] + '</from>\n')
f.write('\t\t<to>' + curdir + '/' + currentFilelist[length - 1] + '</to>\n')
f.write('\t</transition>\n')

f.write('</background>\n')
f.close()
我已经查到声明一个数组的方法
shell是支持数组使用的,目前只能支持一维数组,但参数个数没有限制。

1、申明一个数组

declare -a array

其实不用申明,按数组方式直接赋值给变量即可,bash 就知道那是数组



2、数组赋值

a)array=( var1 var2 var3 ... varN )

b)array=( [0]=var1 [1]=var2 [2]=var3 ... [n]=varN )

c)array[0]=var1 array[1]=var2 array[3]=var3 ... array[n]=varN



3、引用数组

echo ${ array[n] }

n为数组的序号,从0开始



4、计算数组元素个数

${ #array[@] } 或者 ${ #array[*] }

bash的特殊参数 @ 和 * 都表示“扩展位置参数,从1开始”,但形式上稍有差异,但在数组里使用好像是可以通用的。



5、遍历数组

方法一:for循环

for var in ${ array[@] };

do

echo $var

done
但是我不知道怎么读取当前目录的文件并且写入数组。希望高人指点一下。
上次由 ghostry 在 2010-05-13 13:17,总共编辑 1 次。
http://www.ghostry.cn狂网技术工作室,组网建站,平面设计,java项目,空间域名.
好心人点这里进去注册并且用一次,给我增加点流量http://tinyurl.com/272ncjl
电脑配置:
公司:880G/II250/1TB/2G1333/
家:785G+/II245+/1TB/2G677/
头像
ghostry
帖子: 1532
注册时间: 2008-07-23 20:08
来自: http://www.ghostry.cn
联系:

Re: 如何读取当前目录的文件列表并且写入数组

#2

帖子 ghostry » 2010-05-05 13:17

没人理我没办法,研究了一下 py的语句,改了一下,总算能用了,这程序真郁闷,空格都计较

代码: 全选

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Name: slidexml.py
# Author: EthanZ6174
# Email: <[email protected]>
# Site: http://www.noslog.com
# Licence: GPLv3
# Version: 091127

import glob, os
import shutil
import time


curdir = os.getcwd()
os.chdir(curdir)
currentFilelist = glob.glob('*.*')
currentImageFiles = glob.glob('*.jpg')

currentTime = time.localtime()
length = len(currentImageFiles)

for i in currentFilelist:
 if i == 'backgroundslide.xml':
  os.remove(i)

f = file('backgroundslide.xml', 'w')

f.write('<background>\n')
f.write('\t<starttime>\n')
f.write('\t\t<year>' + str(currentTime.tm_year) + '</year>\n')
f.write('\t\t<month>' + str(currentTime.tm_mon) + '</month>\n')
f.write('\t\t<day>' + str(currentTime.tm_mday) + '</day>\n')
f.write('\t\t<hour>' + str(currentTime.tm_hour) + '</hour>\n')
f.write('\t\t<minute>' + str(currentTime.tm_min) + '</minute>\n')
f.write('\t\t<second>' + str(currentTime.tm_sec) + '</second>\n')
f.write('\t</starttime>\n')
f.write('<!--This animation will start at the time it created-->\n')

for i in currentImageFiles:
 length = length - 1
 print length
 #print curdir
 #print currentImageFiles[1]
 f.write('\t<static>\n')
 f.write('\t\t<duration>595.0</duration>\n')
 f.write('\t\t<file>' + curdir + '/' + currentImageFiles[length] +'</file>\n')
 f.write('\t</static>\n')
 f.write('\t<transition>\n')
 f.write('\t\t<duration>5.0</duration>\n')
 f.write('\t\t<from>' + curdir + '/' + currentImageFiles[length] + '</from>\n')
 if length >= 1:
  f.write('\t\t<to>' + curdir + '/' + currentImageFiles[length-1] + '</to>\n')
 if length <1:
  f.write('\t\t<to>' + curdir + '/' + currentImageFiles[len(currentImageFiles)-1] + '</to>\n')
 f.write('\t</transition>\n')

f.write('</background>\n')
f.close()
http://www.ghostry.cn狂网技术工作室,组网建站,平面设计,java项目,空间域名.
好心人点这里进去注册并且用一次,给我增加点流量http://tinyurl.com/272ncjl
电脑配置:
公司:880G/II250/1TB/2G1333/
家:785G+/II245+/1TB/2G677/
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: 如何读取当前目录的文件列表并且写入数组

#3

帖子 trigger » 2010-05-12 17:01

代码: 全选

#!/bin/bash
#本脚本有以下功能:读取当前目录的文件列表并且写入数组
selfname=`basename $0`	#获得脚本自身文件名
x=0			#数组索引初始
for filename in *;
do			#循环当前目录下的文件
	if [ "$selfname" = "$filename" ];then
		continue	#本文件跳过
	else
		array[$x]=$filename	#文件名给数组索引为x的元素
		let "x+=1"		#改变索引指针,步长1
	fi
done
echo ${array[@]}	#打印数组,以便检查程序运行情况
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
头像
ghostry
帖子: 1532
注册时间: 2008-07-23 20:08
来自: http://www.ghostry.cn
联系:

Re: 如何读取当前目录的文件列表并且写入数组

#4

帖子 ghostry » 2010-05-12 21:58

:em05 牛人终于出现啦
http://www.ghostry.cn狂网技术工作室,组网建站,平面设计,java项目,空间域名.
好心人点这里进去注册并且用一次,给我增加点流量http://tinyurl.com/272ncjl
电脑配置:
公司:880G/II250/1TB/2G1333/
家:785G+/II245+/1TB/2G677/
潛龍勿用
帖子: 1
注册时间: 2011-09-22 22:44

Re: 如何读取当前目录的文件列表并且写入数组[已解决]3楼正解

#5

帖子 潛龍勿用 » 2011-09-22 22:48

雖然過了這麼久,不過我還是要告訴你一個最最簡潔的寫法:
arr=(/home/*) #列出/home下的所有文件並賦值給數組arr
echo ${arr[@]} #打印出數組arr的所有元素

簡單就是美...
回复