纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

python编写shell脚本 基于python编写的shell脚本详细讲解

  2021-09-11 我要评论
想了解基于python编写的shell脚本详细讲解的相关内容吗在本文为您仔细讲解python编写shell脚本的相关知识和一些Code实例欢迎阅读和指正我们先划重点:python,shell脚本下面大家一起来学习吧

今天同事叫我编写一个shell脚本话说虽然我受*nix的影响甚深但是对于*nix 里随处可见的sh脚本却是讨厌之极为什么讨厌呢?首先是因为sh脚本那莫名其妙的语法感觉就像随写随扔的程序完全没有任何美感可言其次是sh脚本的处理能力还是比较弱的在文本处理、XML处理还有网络编程方面基本上都要借助于perl,awk等一堆程序我对这些程序也是不大喜欢的况且学习第三方软件总要时间还不如都用python好了

那python可以做shell脚本吗? 首先介绍一个函数:

os.system(command)

这个函数可以调用shell运行命令行command并且返回它的返回值试一下在 python的解释器里输入os.system(”ls -l”)就可以看到”ls”列出了当前目录下的文件可以说通过这个函数python就拥有了shell的所有能力呵呵不过通常这条命令不需要用到因为shell常用的那些命令在python中通常有对应而且同样简洁的写法

shell中最常用的是ls命令python对应的写法是:os.listdir(dirname)这个函数返回字符串列表里面是所有的文件名不过不包含”.”和”..”如果要遍历整个目录的话就会比较复杂一点我们等下再说吧先在解释器里试一下:

>>> os.listdir(”/”)

['tmp', ‘misc', ‘opt', ‘root', ‘.autorelabel', 'sbin', 'srv', ‘.autofsck', ‘mnt', ‘usr', ‘var', ‘etc', 'selinux', ‘lib', ‘net', ‘lost found', 'sys', ‘media', ‘dev', ‘proc', ‘boot', ‘home', ‘bin']

就像这样接下去所有命令都可以在python的解释器里直接运行观看结果

对应于cp命令的是:shutil.copy(src,dest)这个函数有两个参数参数src是指源文件的名字参数dest则是目标文件或者目标目录的名字 如果dest是一个目录名就会在那个目录下创建一个相同名字的文件与shutil.copy函数相类似的是 shutil.copy2(src,dest)不过copy2还会复制最后存取时间和最后更新时间

不过shell的cp命令还可以复制目录python的shutil.copy却不行第一个参数只能是一个文件这怎么办?其实python还有个shutil.copytree(src,dst[,symlinks]) 参数多了一个symlinks它是一个布尔值如果是True的话就创建符号链接

移动或者重命名文件和目录呢?估计被聪明的朋友猜到了shutil.move(src,dst)呵呵与mv命令类似如果src和dst在同一个文件系统上shutil.move只是简单改一下名字如果src和dst在不同的文件系统上shutil.move会先把src复制到dst然后删除src文件看到现在大多数朋友应该已经对 python的能力有点眉目了接下来我就列个表介绍一下其它的函数:

os.chdir(dirname)

把当前工作目录切换到dirname下

os.getcwd()

返回当前的工作目录路径

os.chroot(dirname)

把dirname作为进程的根目录和*nix下的chroot命令类似

os.chmod(path,mode)

更改path的权限位mode可以是以下值(使用or)的组合:

os.S_ISUID
os.S_ISGID
os.S_ENFMT
os.S_ISVTX
os.S_IREAD
os.S_IWRITE
os.S_IEXEC
os.S_IRWXU
os.S_IRUSR
os.S_IWUSR
os.S_IXUSR
os.S_IRWXG
os.S_IRGRP
os.S_IWGRP
os.S_IXGRP
os.S_IRWXO
os.S_IROTH
os.S_IWOTH
os.S_IXOTH

具体它们是什么含义就不仔细说了基本上就是R代表读,W代表写X代表执行权限USR 代表用户GRP代表组OTH代表其它

os.chown(path,uid,gid)

改变文件的属主uid和gid为-1的时候不改变原来的属主

os.link(src,dst)

创建硬连接

os.mkdir(path,[mode])

创建目录mode的意义参见os.chmod()默认是0777

os.makedirs(path,[mode])

和os.mkdir()类似不过会先创建不存在的父目录

os.readlink(path)

返回path这个符号链接所指向的路径

os.remove(path)

删除文件不能用于删除目录

os.rmdir(path)

删除文件夹不能用于删除文件

os.symlink(src,dst)

创建符号链接

shutil.rmtree(path[,ignore_errors[,onerror]])

删除文件夹

介绍了这么多其实只要查一下os和shutil两个模块的文档就有了呵呵真正编写 shell脚本的时候还需要注意:

1.环境变量python的环境变量保存在os.environ这个字典里可以用普通字典的方法修改它使用system启动其它程序的时候会自动被继承比如:

os.environ[”fish”]=”nothing”
不过也要注意环境变量的值只能是字符串和shell有些不同的是python没有 export环境变量这个概念为什么没有呢?因为python没有必要有:-)

2.os.path这个模块里包含了很多关于路径名处理的函数在shell里路径名处理好像不是很重要但是在python里经常需要用到最常用的两个是分离和合并目录名和文件名:

os.path.split(path) -> (dirname,basename)
这个函数会把一个路径分离为两部分比如:os.path.split(”/foo /bar.dat”)会返回(”/foo”,”bar.dat”)

os.path.join(dirname,basename)
这个函数会把目录名和文件名组合成一个完整的路径名比如:os.path.join(”/foo”,”bar.dat”)会返回”/foo/bar.dat”这个函数和os.path.split()刚好相反

还有这些函数:

os.path.abspath(path)

把path转成绝对路径

os.path.expanduser(path)

把path中包含的”~”和”~user”转换成用户目录

os.path.expandvars(path)

根据环境变量的值替换path中包含的”$name”和”${name}”比如环境变量 FISH=nothing那os.path.expandvars(”$FISH/abc”)会返回”nothing/abc”

os.path.normpath(path)

去掉path中包含的”.”和”..”

os.path.splitext(path)

把path分离成基本名和扩展名比如:os.path.splitext(”/foo /bar.tar.bz2″)返回('/foo/bar.tar', ‘.bz2′)要注意它和os.path.split()的区别

3.在os模块有一个很好用的函数叫os.stat()没有介绍因为os.path模块里包含了一组和它具有同样功能的函数但是名字更好记一点

os.path.exists(path)

判断文件或者目录是否存在

os.path.isfile()

判断path所指向的是否是一个普通文件而不是目录

os.path.isdir(path)

判断path所指向的是否是一个目录而不是普通文件

os.path.islink(path)

判断path所指向的是否是一个符号链接

os.path.ismount(path)

判断path所指向的是否是一个挂接点(mount point)

os.path.getatime(path)

返回path所指向的文件或者目录的最后存取时间

os.path.getmtime(path)

返回path所指向的文件或者目录的最后修改时间

os.path.getctime(path)

返回path所指向的文件的创建时间

os.path.getsize(path)

返回path所指向的文件的大小

4.应用python编写shell脚本经常要用到os,shutil,glob(正则表达式的文件名),tempfile(临时文件),pwd(操作/etc/passwd文件),grp(操作/etc/group文件),commands(取得一个命令的输出)前面两个已经基本上介绍完了后面几个很简单看一下文档就可以了

5.sys.argv是一个列表保存了python程序的命令行参数其中 sys.argv[0]是程序本身的名字
不能光说不练接下来我们就编写一个用于复制文件的简单脚本前两天叫我写脚本的同事有个几万个文件的目录他想复制这些文件到其它的目录又不能直接复制目录本身他试了一下”cp src/* dest/”结果报了一个命令行太长的错误让我帮他写一个脚本操起python来:

import sys,os.path,shutil
for f in os.listdir(sys.argv[1]):
shutil.copy(os.path.join(sys.argv[1],f),sys.argv[2])

再试一下linuxapp版里的帖子——把一个文件夹下的所有文件重命名成 10001~10999可以这样写:

import os.path,sys
dirname=sys.argv[1]
i=10001
for f in os.listdir(dirname):
src=os.path.join(dirname,f)
if os.path.isdir(src):
continue
os.rename(src,str(i))
i =1

os.chkdir(path) 转换到目录path 下

os.system('md a') 可以直接创建目录

os.name字符串指示你正在使用的平台比如对于Windows它是'nt'而对于Linux/Unix用户它是'posix'
● os.getcwd()函数得到当前工作目录即当前Python脚本工作的目录路径
● os.getenv()和os.putenv()函数分别用来读取和设置环境变量
● os.listdir()返回指定目录下的所有文件和目录名
● os.remove()函数用来删除一个文件
● os.system()函数用来运行shell命令
● os.linesep字符串给出当前平台使用的行终止符例如Windows使用'\r\n'Linux使用'\n'而Mac使用'\r'
● os.path.split()函数返回一个路径的目录名和文件名
>>> os.path.split('/home/swaroop/byte/code/poem.txt')
('/home/swaroop/byte/code', 'poem.txt')
● os.path.isfile()和os.path.isdir()函数分别检验给出的路径是一个文件还是目录类似地os.path.exists()函数用来检验给出的路径是否真地存在

文件重定向

已有PY文件new1.py ,在命令行下输入:new1>new.txt 可以将new1运行的结果输出到文件new.txt,这称为流重定向


相关文章

猜您喜欢

网友评论

Copyright 2020 www.sopisoft.net 【绿软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式