脚本文件常用命令

附录1.  Shell脚本命令

shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

  1. 注释

“# ”开头的就是注释,被编译器忽略

单行注释:#,多行注释: :<

  1. 变量

变量类型

运行shell时,会同时存在三种变量:

局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

变量操作

创建普通变量:name=“test”(=两边不可有空格)。

创建只可函数体中使用的局部变量: local name="test" (使用local修饰的变量在函数体外无法访问,并且local只能在函数体内使用)。

使用变量: echo $name 或者 echo ${name} (推荐使用大括号版)

变量重新赋值: name="new_test" (将原值覆盖)

只读变量: name="only_read" -> readonly name (使用readonly标识后的变量,不可被修改)

删除变量: unset name; (删除之后不可访问,删除不掉只读变量)

字符串变量

  1. 单引号

单引号变量var='test' ,只能原样输出,变量无效

单引号中不能出现一个单独的单引号,转义也不可以

  1. 双引号

双引号变量var=“my name is ${name}”,变量有效

可出现转义符

  1. 拼接字符串

中间无任何+,之类的字符

name="this is"" my name"; name="this is my name"; name="this" is "my name" 等效

name='this is'' my nam'; name='this is my name'; name='this' is 'my name' 等效

  1. 获取字符串长度

在${}中使用“#”获取长度

name="test";

echo ${#name}; #输出为4

  1. 提取子字符串

1:4从第2个开始, 往后截取4个字符

::4从第一个字符开始 往后截取4个字符

name="this is my name";

echo ${name:1:4} #输出 is i

echo ${name::4} #输出 this

  1. 数组

bash只支持一维数组,不支持多维数组。

定义数组:array_name=(li wang xiang zhang) (小括号做边界、使用空格分离)

单独定义数组的元素: array_para[0]="w"; array_para[3]="s" (定义时下标不连续也可以)

赋值数组元素:array_name[0]="zhao";

获取数组元素:

array_name[0]="li"

array_name[3]="zhang"

echo ${array_name[0]} # 输出"li"

echo ${array_name[1]} # 输出" "

echo ${array_name[3]} # 输出"zhang"

echo ${array_name[@]} # 输出"li zhang" 输出数组所有元素,没有元素的下标省略

取得元素个数:${#array_name[@]} 或者 ${#array_name}

取得单个元素长度:${#array_name[1]}

  1. 参数传递

获取参数值:

$0 : 固定,代表执行的文件名

$1 : 代表传入的第1个参数

$n : 代表传入的第n个参数

 

$#:参数个数

$*:以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数

$@:与$*相同,但是使用时加引号,并在引号中返回每个参数。

$\$:脚本运行的当前进程号

$!:后台运行的最后一个进程的ID

$?: 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$* 与 $@ 区别

相同点:都是引用所有参数。

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)

 

  1. 运算符
  1. 算数运算

+ 、-、*、\:乘号前必须加\进行转义才可以进行乘法运算

加法运算

val=`expr 2 + 2`(使用linux命令expr进行辅助运算)

val=$[2+2](4个空格不是必要的,不同于条件判断)

val=$((2+2))

  1. 数字关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下面假定变量 a 为 10,变量 b 为 20

 

-eq :检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。

-ne: 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。

-gt: 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。

-lt : 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。

-ge: 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。

-le : 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

  1. 字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

= :检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。

!= :检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。

-z :检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。

-n :检测字符串长度是否为0,不为0返回 true。 [ -n "$a" ] 返回 true。

$ :检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

  1. 布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

! :非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。

-o :或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。

-a :与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

  1. 逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

&& :逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false

|| :逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

  1. 文件运算符

-b file :检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。

-c file :检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。

-d file :检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。

-f file :检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。

-g file :检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。

-k file :检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。

-p file :检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。

-u file :检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。

-r file :检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。

-w file :检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。

-x file :检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。

-s file :检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。

-e file :检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

  1. 命令替换

命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

执行命令:

  1. `ls /etc`: 反引号 (所有的unix系统都支持)
  2. $(ls /etc): $+() (部分unix系统不支持)

多个嵌套使用时,从内向外执行for file in \s /etc\ 或 for file in $(ls /etc) 循环中使用`dirname \$0` 获取脚本文件所在的目录

path=$(cd `dirname $0`;pwd):获取脚本当前所在目录,并且执行cd命令到达该目录,使用pwd获取路径并赋值到path变量

  1. 算术运算

$[ ] : 加减乘除,不必添加空格

$(( )) :加减乘除等,不必添加空格

  1. 逻辑判断

[ ] : 中括号旁边和运算符两边必须添加空格 (可以使用,不推荐)

[[ ]]:中括号旁边和运算符两边必须添加空格 (字符串验证时,推荐使用)

(()) : 中括号旁边和运算符两边必须添加空格 (数字验证时,推荐使用)

[[]] 和 (()) 分别是[ ]的针对数学比较表达式和字符串表达式的加强版。

使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

[[ ]]中增加模式匹配特效;

(( ))不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号

  1. 输出

echo
仅用于字符串的输出,没有使用printf作为输出的移植性好,建议使用printf

printf

printf 不会像 echo 自动添加换行符,我们可以手动添加 \n

无大括号,直接以空格分隔

  1. 流程控制

sh的流程控制不可为空,即if或者else的大括号中无任何语句

  1. 定义函数

可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

函数定义[ function ] funname() { action; [return int;] }

参数传递

调用函数: fun_name 2 3 4

函数中使用:和shell取用函数相同 $n $# $* $? 或者加上{}funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !"} funWithParam 1 2 3 4 5 6 7 8 9 34 73 echo $? \# 判断执行是否成功

函数返回值

return字样可存在也可不存在

return 只能为 return [0-255],此处的返回可作为函数执行的状态,通过$?获取的便是这个返回值

如果不加return , 则默认最后一条语句的执行状态所为函数执行状态的返回值,如果最后一条语句执行成功,则$?为0,否则不为0

使用函数返回值(Janusgraph图数据库官方启动服务脚本片段)

return返回的数字,只是作为函数执行状态的返回值,也就是接下来$?获取的值

对于类似于下面的BIN=\abs_path``语句,获取的是函数体内所有的echo、printf输出组合成的一个字符串 abs_path() { SOURCE="${BASH_SOURCE[0]}" while [ -h "$SOURCE" ]; do DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" SOURCE="$(readlink "$SOURCE")" [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" done echo "test" echo "$( cd -P "$( dirname "$SOURCE" )" && pwd )" # 此函数的两个echo输出会组合成一个字符串作为下述BIN的值 }

 

附录2.  Linux常用命令

  1. 系统信息
  2. arch 显示机器的处理器架构
  3. uname -m 显示机器的处理器架构
  4. uname -r 显示正在使用的内核版本
  5. dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)
  6. hdparm -i /dev/hda 罗列一个磁盘的架构特性
  7. hdparm -tT /dev/sda 在磁盘上执行测试性读取操作
  8. cat /proc/cpuinfo 显示CPU info的信息
  9. cat /proc/interrupts 显示中断
  10. cat /proc/meminfo 校验内存使用
  11. cat /proc/swaps 显示哪些swap被使用
  12. cat /proc/version 显示内核的版本
  13. cat /proc/net/dev 显示网络适配器及统计
  14. cat /proc/mounts 显示已加载的文件系统
  15. lspci -tv 罗列 PCI 设备
  16. lsusb -tv 显示 USB 设备
  17. date 显示系统日期
  18. cal 2007 显示2007年的日历表
  19. date 041217002007.00 设置日期和时间 - 月日时分年.秒
  20. clock -w 将时间修改保存到 BIOS
  21.  
  22.  
  23.  
  24. 关机 (系统的关机、重启以及登出 )
  25. shutdown -h now 关闭系统
  26. init 0 关闭系统
  27. telinit 0 关闭系统
  28. shutdown -h hours:minutes & 按预定时间关闭系统
  29. shutdown -c 取消按预定时间关闭系统
  30. shutdown -r now 重启
  31. reboot 重启
  32. logout 注销
  33.  
  34.  
  35. 文件和目录
  36. cd /home 进入 '/ home' 目录'
  37. cd .. 返回上一级目录
  38. cd ../.. 返回上两级目录
  39. cd 进入个人的主目录
  40. cd ~user1 进入个人的主目录
  41. cd - 返回上次所在的目录
  42. pwd 显示工作路径
  43. ls 查看目录中的文件
  44. ls -F 查看目录中的文件
  45. ls -l 显示文件和目录的详细资料
  46. ls -a 显示隐藏文件
  47. ls *[0-9]* 显示包含数字的文件名和目录名
  48. tree 显示文件和目录由根目录开始的树形结构
  49. lstree 显示文件和目录由根目录开始的树形结构
  50. mkdir dir1 创建一个叫做 'dir1' 的目录'
  51. mkdir dir1 dir2 同时创建两个目录
  52. mkdir -p /tmp/dir1/dir2 创建一个目录树
  53. rm -f file1 删除一个叫做 'file1' 的文件'
  54. rmdir dir1 删除一个叫做 'dir1' 的目录'
  55. rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容
  56. rm -rf dir1 dir2 同时删除两个目录及它们的内容
  57. mv dir1 new_dir 重命名/移动 一个目录
  58. cp file1 file2 复制一个文件
  59. cp dir/* . 复制一个目录下的所有文件到当前工作目录
  60. cp -a /tmp/dir1 . 复制一个目录到当前工作目录
  61. cp -a dir1 dir2 复制一个目录
  62.  
  63. cp -r dir1 dir2 复制一个目录及子目录
  64. ln -s file1 lnk1 创建一个指向文件或目录的软链接
  65. ln file1 lnk1 创建一个指向文件或目录的物理链接
  66. touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm)
  67. file file1 outputs the mime type of the file as text
  68. iconv -l 列出已知的编码
  69. iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding.
  70. find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)
  71.  
  72.  
  73.  
  74. 文件搜索
  75. find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
  76. find / -user user1 搜索属于用户 'user1' 的文件和目录
  77. find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件
  78. find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件
  79. find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件
  80. find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限
  81. find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备
  82. locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令
  83. whereis halt 显示一个二进制文件、源码或man的位置
  84. which halt 显示一个二进制文件或可执行文件的完整路径
  85.  
  86.  
  87.  
  88. 挂载一个文件系统
  89. mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在
  90. umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出
  91. fuser -km /mnt/hda2 当设备繁忙时强制卸载
  92. umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用
  93. mount /dev/fd0 /mnt/floppy 挂载一个软盘
  94. mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom
  95. mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom
  96. mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom
  97. mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件
  98. mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统
  99. mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备
  100. mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享
  101.  
  102.  
  103.  
  104. 磁盘空间
  105. df -h 显示已经挂载的分区列表
  106. ls -lSr |more 以尺寸大小排列文件和目录
  107. du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间'
  108. du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小
  109. rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统)
  110. dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统)
  111.  
  112.  
  113.  
  114. 用户和群组
  115. groupadd group_name 创建一个新用户组
  116. groupdel group_name 删除一个用户组
  117. groupmod -n new_group_name old_group_name 重命名一个用户组
  118. useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户
  119. useradd user1 创建一个新用户
  120. userdel -r user1 删除一个用户 ( '-r' 排除主目录)
  121. usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性
  122. passwd 修改口令
  123. passwd user1 修改一个用户的口令 (只允许root执行)
  124. chage -E 2005-12-31 user1 设置用户口令的失效期限
  125. pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户
  126. grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组
  127. newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组
  128.  
  129.  
  130.  
  131. 文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消
  132. ls -lh 显示权限
  133. ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示
  134. chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限
  135. chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限
  136. chown user1 file1 改变一个文件的所有人属性
  137. chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性
  138. chgrp group1 file1 改变文件的群组
  139. chown user1:group1 file1 改变一个文件的所有人和群组属性
  140. find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件
  141. chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限
  142. chmod u-s /bin/file1 禁用一个二进制文件的 SUID位
  143. chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的
  144. chmod g-s /home/public 禁用一个目录的 SGID 位
  145. chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件
  146. chmod o-t /home/public 禁用一个目录的 STIKY 位
  147.  
  148.  
  149.  
  150. 文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消
  151. chattr +a file1 只允许以追加方式读写文件
  152. chattr +c file1 允许这个文件能被内核自动压缩/解压
  153. chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件
  154. chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接
  155. chattr +s file1 允许一个文件被安全地删除
  156. chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘
  157. chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件
  158. lsattr 显示特殊的属性
  159.  
  160.  
  161.  
  162. 打包和压缩文件
  163. bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件
  164. bzip2 file1 压缩一个叫做 'file1' 的文件
  165. gunzip file1.gz 解压一个叫做 'file1.gz'的文件
  166. gzip file1 压缩一个叫做 'file1'的文件
  167. gzip -9 file1 最大程度压缩
  168. rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包
  169. rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1'
  170. rar x file1.rar 解压rar包
  171. unrar x file1.rar 解压rar包
  172. tar -cvf archive.tar file1 创建一个非压缩的 tarball
  173. tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件
  174. tar -tf archive.tar 显示一个包中的内容
  175. tar -xvf archive.tar 释放一个包
  176. tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下
  177. tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包
  178. tar -jxvf archive.tar.bz2 解压一个bzip2格式的压缩包
  179. tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包
  180. tar -zxvf archive.tar.gz 解压一个gzip格式的压缩包
  181. zip file1.zip file1 创建一个zip格式的压缩包
  182. zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包
  183. unzip file1.zip 解压一个zip格式压缩包
  184.  
  185.  
  186.  
  187. RPM - (Fedora, Redhat及类似系统)
  188. rpm -ivh package.rpm 安装一个rpm包
  189. rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告
  190. rpm -U package.rpm 更新一个rpm包但不改变其配置文件
  191. rpm -F package.rpm 更新一个确定已经安装的rpm包
  192. rpm -e package_name.rpm 删除一个rpm包
  193. rpm -qa 显示系统中所有已经安装的rpm包
  194. rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包
  195. rpm -qi package_name 获取一个已安装包的特殊信息
  196. rpm -qg "System Environment/Daemons" 显示一个组件的rpm包
  197. rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表
  198. rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表
  199. rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表
  200. rpm -q package_name --whatprovides 显示一个rpm包所占的体积
  201. rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l
  202. rpm -q package_name --changelog 显示一个rpm包的修改历史
  203. rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供
  204. rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表
  205. rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书
  206. rpm --checksig package.rpm 确认一个rpm包的完整性
  207. rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性
  208. rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间
  209. rpm -Va 检查系统中所有已安装的rpm包- 小心使用
  210. rpm -Vp package.rpm 确认一个rpm包还未安装
  211. rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件
  212. rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包
  213. rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包
  214.  
  215.  
  216.  
  217. YUM 软件包升级器 - (Fedora, RedHat及类似系统)
  218. yum install package_name 下载并安装一个rpm包
  219. yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系
  220. yum update package_name.rpm 更新当前系统中所有安装的rpm包
  221. yum update package_name 更新一个rpm包
  222. yum remove package_name 删除一个rpm包
  223. yum list 列出当前系统中安装的所有包
  224. yum search package_name 在rpm仓库中搜寻软件包
  225. yum clean packages 清理rpm缓存删除下载的包
  226. yum clean headers 删除所有头文件
  227. yum clean all 删除所有缓存的包和头文件
  228.  
  229.  
  230.  
  231. DEB (Debian, Ubuntu 以及类似系统)
  232. dpkg -i package.deb 安装/更新一个 deb 包
  233. dpkg -r package_name 从系统删除一个 deb 包
  234. dpkg -l 显示系统中所有已经安装的 deb 包
  235. dpkg -l | grep httpd 显示所有名称中包含 "httpd" 字样的deb包
  236. dpkg -s package_name 获得已经安装在系统中一个特殊包的信息
  237. dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表
  238. dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表
  239. dpkg -S /bin/ping 确认所给的文件由哪个deb包提供
  240.  
  241.  
  242.  
  243. APT 软件工具 (Debian, Ubuntu 以及类似系统)
  244. apt-get install package_name 安装/更新一个 deb 包
  245. apt-cdrom install package_name 从光盘安装/更新一个 deb 包
  246. apt-get update 升级列表中的软件包
  247. apt-get upgrade 升级所有已安装的软件
  248. apt-get remove package_name 从系统删除一个deb包
  249. apt-get check 确认依赖的软件仓库正确
  250. apt-get clean 从下载的软件包中清理缓存
  251. apt-cache search searched-package 返回包含所要搜索字符串的软件包名称
  252.  
  253.  
  254.  
  255. 查看文件内容
  256. cat file1 从第一个字节开始正向查看文件的内容
  257. tac file1 从最后一行开始反向查看一个文件的内容
  258. more file1 查看一个长文件的内容
  259. less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作
  260. head -2 file1 查看一个文件的前两行
  261. tail -2 file1 查看一个文件的最后两行
  262. tail -f /var/log/messages 实时查看被添加到一个文件中的内容
  263.  
  264.  
  265.  
  266. 文本处理
  267. cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
  268. cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中
  269. cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中
  270. grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug"
  271. grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇
  272. grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行
  273. grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug"
  274. sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2"
  275. sed '/^$/d' example.txt 从example.txt文件中删除所有空白行
  276. sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行
  277. echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容
  278. sed -e '1d' result.txt 从文件example.txt 中排除第一行
  279. sed -n '/stringa1/p' 查看只包含词汇 "string1"的行
  280. sed -e 's/ *$//' example.txt 删除每一行最后的空白字符
  281. sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部
  282. sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容
  283. sed -n '5p;5q' example.txt 查看第5行
  284. sed -e 's/00*/0/g' example.txt 用单个零替换多个零
  285. cat -n file1 标示文件的行数
  286. cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行
  287. echo a b c | awk '{print $1}' 查看一行第一栏
  288. echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏
  289. paste file1 file2 合并两个文件或两栏的内容
  290. paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分
  291. sort file1 file2 排序两个文件的内容
  292. sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份)
  293. sort file1 file2 | uniq -u 删除交集,留下其他的行
  294. sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件)
  295. comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容
  296. comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容
  297. comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分
  298.  
  299.  
  300.  
  301.  
  302. 字符设置和文件格式转换
  303. dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX
  304. unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS
  305. recode ..HTML < page.txt > page.html 将一个文本文件转换成html
  306. recode -l | more 显示所有允许的转换格式
  307.  
  308.  
  309.  
  310. 文件系统分析
  311. badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块
  312. fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性
  313. fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
  314. e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
  315. e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
  316. fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
  317. fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性
  318. fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
  319. dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
  320.  
  321.  
  322.  
  323. 初始化一个文件系统
  324. mkfs /dev/hda1 在hda1分区创建一个文件系统
  325. mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统
  326. mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统
  327. mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统
  328. fdformat -n /dev/fd0 格式化一个软盘
  329. mkswap /dev/hda3 创建一个swap文件系统
  330.  
  331.  
  332.  
  333. SWAP文件系统
  334. mkswap /dev/hda3 创建一个swap文件系统
  335. swapon /dev/hda3 启用一个新的swap文件系统
  336. swapon /dev/hda2 /dev/hdb3 启用两个swap分区
  337.  
  338.  
  339.  
  340. 备份
  341. dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份
  342. dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份
  343. restore -if /tmp/home0.bak 还原一个交互式备份
  344. rsync -rogpav --delete /home /tmp 同步两边的目录
  345. rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync
  346. rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录
  347. rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录
  348. dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作
  349. dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件
  350. tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作
  351. ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通过ssh在远程目录中复制一个目录内容
  352. ( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通过ssh在远程目录中复制一个本地目录
  353. tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接
  354. find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录
  355. find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包
  356. dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作
  357. dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容
  358.  
  359.  
  360.  
  361. 光盘
  362. cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容
  363. mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件
  364. mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件
  365. mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件
  366. cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件
  367. gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件
  368. mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件
  369. cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中
  370. cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中(参数-3)
  371. cdrecord --scanbus 扫描总线以识别scsi通道
  372. dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD
  373.  
  374.  
  375.  
  376. 网络 - (以太网和WIFI无线)
  377. ifconfig eth0 显示一个以太网卡的配置
  378. ifup eth0 启用一个 'eth0' 网络设备
  379. ifdown eth0 禁用一个 'eth0' 网络设备
  380. ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址
  381. ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing)
  382. dhclient eth0 以dhcp模式启用 'eth0'
  383. route -n show routing table
  384. route add -net 0/0 gw IP_Gateway configura default gateway
  385. route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16'
  386. route del 0/0 gw IP_gateway remove static route
  387. echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing
  388. hostname show hostname of system
  389. host www.example.com lookup hostname to resolve name to ip address and viceversa
  390. nslookup www.example.com lookup hostname to resolve name to ip address and viceversa
  391. ip link show show link status of all interfaces
  392. mii-tool eth0 show link status of 'eth0'
  393. ethtool eth0 show statistics of network card 'eth0'
  394. netstat -tup show all active network connections and their PID
  395. netstat -tupl show all network services listening on the system and their PID
  396. tcpdump tcp port 80 show all HTTP traffic
  397. iwlist scan show wireless networks
  398. iwconfig eth1 show configuration of a wireless network card
  399. hostname show hostname
  400. host www.example.com lookup hostname to resolve name to ip address and viceversa
  401. nslookup www.example.com lookup hostname to resolve name to ip address and viceversa
  402. whois www.example.com lookup on Whois database

 

 

 

附录3.  Windows批处理命令

 

批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效。

批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行

批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序。

一般情况下,每条命令占据一行,当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中。

还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出。

批处理命令简介

echo

输出提示信息

rem

注释

pause

输出提示信息"Press any key to continue...“

call

调用另一个批处理

start

启动程序或指令。可查看与call的不同

goto

跳转命令

set

常用设置变量值

/?

查看命令帮助

批处理常用命令总结

@

回显屏蔽

> < >>

重定向

|

管道符号

^

转义符

& && ||

逻辑命令符

常用Dos命令

文件夹管理

cd

显示当前目录名或改变当前目录

md

创建目录

rd

删除一个目录

dir

显示目录中的文件和子目录列表

tree

以图形显示驱动器或路径的文件夹结构

path

为可执行文件显示或设置一个搜索路径

xcopy

复制文件和目录树

文件管理

type

显示文本文件的内容

copy

将一份或多份文件复制到另一个位置

del

删除一个或数个文件

move

移动文件并重命名文件和目录

ren

重命名文件

replace

替换文件

attrib

显示或更改文件属性

find

搜索字符串

fc

比较两个文件或两个文件集并显示它们之间的不同

网络命令

Ping

进行网络连接测试、名称解析

ftp

文件传输

net

网络命令集及用户管理

telnet

远程登陆

ipconfig

显示、修改TCP/IP设置

msg

给用户发送消息

arp

显示、修改局域网的IP地址-物理地址映射列表

系统管理

at

安排在特定日期和时间运行命令和程序

shutdown

立即或定时关机或重启

tskill

结束进程

taskkill

结束进程(比tskill高级,但WinXPHome版中无该命令)

tasklist

显示进程列表

sc

系统服务设置与控制

reg

注册表控制台工具

powercfg

控制系统上的电源设置

 

Windows Batch 常用命令

 

1 echo @

回显命令

#关闭单行回显

echo off  #从下一行开始关闭回显

@echo off  #从本行开始关闭回显。一般批处理第一行都是这个

echo on #从下一行开始打开回显

echo #显示当前是 echo off 状态还是 echo on 状态

echo. #输出一个回车换行,空白行

#(echo, echo; echo+ echo[ echo] echo/ echo)

 

2 errorlevel

echo %errorlevel%

每个命令运行结束,可以用这个命令行格式查看返回码

默认值为0,一般命令执行出错会设 errorlevel 1

 

3 dir

显示文件夹内容

dir #显示当前目录中的文件和子目录

dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件

dir c: /a:d #显示 C 盘当前目录中的目录

dir c: /a:-d #显示 C 盘根目录中的文件

dir c: /b/p #/b只显示文件名,/p分页显示

dir *.exe /s #显示当前目录和子目录里所有的.exe文件

 

4 cd

切换目录

cd #进入根目录

cd #显示当前目录

cd /d d:sdk #可以同时更改盘符和目录

 

5 md

创建目录

md d:abc #如果 d:a 不存在,将会自动创建中级目录

#如果命令扩展名被停用,则需要键入 mkdir abc

 

6 rd

删除目录

rd abc #删除当前目录里的 abc 子目录,要求为空目录

rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式

 

7 del

删除文件

del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件

del /q/a/f d:temp*.*

删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录

del /q/a/f/s d:temp*.*

删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录

 

8 ren

重命名命令

ren d:temp tmp #支持对文件夹的重命名

 

9 cls

清屏

10 type

显示文件内容

type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码

type *.txt #显示当前目录里所有.txt文件的内容

 

11 copy

拷贝文件

copy c:test.txt d:test.bak

复制 c:test.txt 文件到 d: ,并重命名为 test.bak

copy con test.txt

从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件

con代表屏幕,prn代表打印机,nul代表空设备

copy 1.txt + 2.txt 3.txt

合并 1.txt 2.txt 的内容,保存为 3.txt 文件

如果不指定 3.txt ,则保存到 1.txt

copy test.txt +

复制文件到自己,实际上是修改了文件日期

 

12 title

设置cmd窗口的标题

title 新标题 #可以看到cmd窗口的标题栏变了

 

13 ver

显示系统版本

 

14 label vol

设置卷标

vol #显示卷标

label #显示卷标,同时提示输入新卷标

label c:system #设置C盘的卷标为 system

 

15 pause

暂停命令

 

16 rem ::

注释命令

注释行不执行操作

 

17 date time

日期和时间

date #显示当前日期,并提示输入新日期,按"回车"略过输入

date/t #只显示当前日期,不提示输入新日期

time #显示当前时间,并提示输入新时间,按"回车"略过输入

time/t #只显示当前时间,不提示输入新时间

 

18 goto :

跳转命令

:label #行首为:表示该行是标签行,标签行不执行操作

goto label #跳转到指定的标签那一行

 

19 find (外部命令)

查找命令

find "abc" c:test.txt

c:test.txt 文件里查找含 abc 字符串的行

如果找不到,将设 errorlevel 返回码为1

find /i “abc” c:test.txt

查找含 abc 的行,忽略大小写

find /c "abc" c:test.txt

显示含 abc 的行的行数

 

20 more (外部命令)

逐屏显示

more c:test.txt #逐屏显示 c:test.txt 的文件内容

 

21 tree

显示目录结构

tree d: #显示D盘的文件目录结构

 

22 &

顺序执行多条命令,而不管命令是否执行成功

 

23 &&

顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令

find "ok" c:test.txt && echo 成功

如果找到了"ok"字样,就显示"成功",找不到就不显示

 

24 ||

顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

find "ok" c:test.txt || echo 不成功

如果找不到"ok"字样,就显示"不成功",找到了就不显示

 

25 |

管道命令

dir *.* /s/a | find /c ".exe"

管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令

该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数

type c:test.txt|more

这个和 more c:test.txt 的效果是一样的

 

26 > >>

输出重定向命令

> 清除文件中原有的内容后再写入

>> 追加内容到文件末尾,而不会清除原有的内容

主要将本来显示在屏幕上的内容输出到指定文件中

指定文件如果不存在,则自动生成该文件

type c:test.txt >prn

屏幕上不显示文件内容,转向输出到打印机

echo hello world>con

在屏幕上显示hello world,实际上所有输出都是默认 >con

copy c:test.txt f: >nul

拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息

copy c:test.txt f: >nul 2>nul

不显示文件复制成功的提示信息,并且f盘不存在的话,也不显示错误提示信息

echo ^^W ^> ^W>c:test.txt

生成的文件内容为 ^W > W

^ > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号

 

27 <

从文件中获得输入信息,而不是从屏幕上

一般用于 date time label 等需要等待输入的命令

@echo off

echo 2005-05-01>temp.txt

date

del temp.txt

这样就可以不等待输入直接修改当前日期

 

28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*

命令行传递给批处理的参数

%0 批处理文件本身

%1 第一个参数

%9 第九个参数

%* 从第一个参数开始的所有参数

批参数(%n)的替代已被增强。您可以使用以下语法:

%~1 - 删除引号(" ) 扩充 %1

%~f1 - %1 扩充到一个完全合格的路径名

%~d1 - 仅将 %1 扩充到一个驱动器号

%~p1 - 仅将 %1 扩充到一个路径

%~n1 - 仅将 %1 扩充到一个文件名

%~x1 - 仅将 %1 扩充到一个文件扩展名

%~s1 - 扩充的路径指含有短名

%~a1 - %1 扩充到文件属性

%~t1 - %1 扩充到文件的日期/时间

%~z1 - %1 扩充到文件的大小

%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1

扩充到找到的第一个完全合格的名称。如果环境

变量名未被定义,或者没有找到文件,此组合键会

扩充到空字符串

可以组合修定符来取得多重结果:

%~dp1 - 只将 %1 扩展到驱动器号和路径

%~nx1 - 只将 %1 扩展到文件名和扩展名

%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1

并扩展到找到的第一个文件的驱动器号和路径。

%~ftza1 - %1 扩展到类似 DIR 的输出行。

可以参照 call/? for/? 看出每个参数的含意

echo load "%%1" "%%2">c:test.txt

生成的文件内容为 load "%1"  "%2"

批处理文件里,用这个格式把命令行参数输出到文件

 

29 if

判断命令

if "%1"=="/a" echo 第一个参数是/a

if /i "%1" equ "/a" echo 第一个参数是/a

/i 表示不区分大小写,equ == 是一样的,其它运算符参见 if/?

if exist c:test.bat echo 存在c:test.bat文件

if not exist c:windows (

echo 不存在c:windows文件夹

)

if exist c:test.bat (

echo 存在c:test.bat

) else (

echo 不存在c:test.bat

)

30 setlocal endlocal

设置命令扩展名延缓环境变量扩充

SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"

SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"

SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"

SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"

ENDLOCAL #恢复到使用SETLOCAL语句以前的状态

命令扩展名默认为启用

延缓环境变量扩充默认为停用

批处理结束系统会自动恢复默认值

可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程

序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS ENDLOCAL 语句,以确

保程序能在其它系统上正确运行

"延缓环境变量扩充"主要用于 if for 的符合语句,在 set 的说明里有其实用例程

 

31 set

设置变量

引用变量可在变量名前后加 % ,即 %变量名%

set #显示目前所有可用的变量,包括系统变量和自定义的变量

echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用

set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1

set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2

echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2

echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2

echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2

echo %p:~0,3% #显示前3个字符,即aa1

echo %p:~-2% #显示最后面的2个字符,即b2

echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b

echo %p:aa=c% #c替换变量p中所有的aa,即显示c1bb1c2bb2

echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2

echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2

set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2

set /a p=39 #设置p为数值型变量,值为39

set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3p=3

set /a p=p/10 # /a 参数时,在 = 后面的变量可以不加%直接引用

set /a p=”1&0″ #”运算,要加引号。其它支持的运算符参见set/?

set p= #取消p变量

set /p p=请输入

屏幕上显示请输入,并会将输入的字符串赋值给变量p

注意这条可以用来取代 choice 命令

注意变量在 if for 的复合语句里是一次性全部替换的,如

@echo off

set p=aaa

if %p%==aaa (

echo %p%

set p=bbb

echo %p%

)

结果将显示

aaa

aaa

因为在读取 if 语句时已经将所有 %p% 替换为aaa

这里的"替换",在 /? 帮助里就是指"扩充""环境变量扩充"

可以启用延缓环境变量扩充,用 ! 来引用变量,即 !变量名!

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

set p=aaa

if %p%==aaa (

echo %p%

set p=bbb

echo !p!

)

ENDLOCAL

结果将显示

aaa

bbb

还有几个动态变量,运行 set 看不到

%CD% #代表当前目录的字符串

%DATE% #当前日期

%TIME% #当前时间

%RANDOM% #随机整数,介于0~32767

%ERRORLEVEL% #当前 ERRORLEVEL

%CMDEXTVERSION% #当前命令处理器扩展名版本号

%CMDCMDLINE% #调用命令处理器的原始命令行

可以用echo命令查看每个变量值,如 echo %time%

注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到

 

32 start

批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令

 

33 call

批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行

有时有的应用程序用start调用出错的,也可以call调用

 

34 choice (外部命令)

选择命令

让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel1234……

win98里是choice.com

win2000pro里没有,可以从win98里拷过来

win2003里是choice.exe

choice /N /C y /T 5 /D y>nul

延时5

 

35 assoc ftype

文件关联

assoc 设置'文件扩展名'关联,关联到'文件类型'

ftype 设置'文件类型'关联,关联到'执行程序和参数'

当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开

而是先判断.txt属于 txtfile '文件类型'

再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1

可以在"文件夹选项""文件类型"里修改这2种关联

assoc #显示所有'文件扩展名'关联

assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile

assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8

assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile

ftype #显示所有'文件类型'关联

ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*

assoc .txt=Word.Document.8

设置.txtword类型的文档,可以看到.txt文件的图标都变了

assoc .txt=txtfile

恢复.txt的正确关联

ftype exefile="%1" %*

恢复 exefile 的正确关联

如果该关联已经被破坏,可以运行 command.com ,再输入这条命令

 

36 pushd popd

切换当前目录

@echo off

c: & cd & md mp3 # C: 建立 mp3 文件夹

md d:mp4 # D: 建立 mp4 文件夹

cd /d d:mp4 #更改当前目录为 d:mp4

pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3

popd #恢复当前目录为刚才保存的 d:mp4

 

37 for

循环命令

这个比较复杂,请对照 for/? 来看

for %%i in (c: d: e: f:) do echo %%i

依次调用小括号里的每个字符串,执行 do 后面的命令

注意%%i,在批处理中 for 语句调用参数用2%

默认的字符串分隔符是"空格键""Tab""回车键"

for %%i in (*.txt) do find "abc" %%i

对当前目录里所有的txt文件执行 find 命令

for /r . %%i in (*.txt) do find "abc" %%i

在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行

for /r . %%i in (.) do echo %%~pni

显示当前目录名和所有子目录名,包括路径,不包括盘符

for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt

d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去

for /l %%i in (2,1,8) do echo %%i

生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1

for /f %%i in ('set') do echo %%i

set 命令的输出结果循环调用,每行一个

for /f "eol=P" %%i in ('set') do echo %%i

set 命令的输出结果,忽略以 P 开头的那几行

for /f %%i in (d:mp3.txt) do echo %%i

显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称

for /f "delims=" %%i in (d:mp3.txt) do echo %%i

显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称

for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a

dir 命令的结果,跳过前面5行,余下的每行取第4

每列之间的分隔符为默认的"空格"

可以注意到 dir 命令输出的前5行是没有文件名的

for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (

echo %%a

echo %%b

echo %%c

)

date /t 的输出结果,每行取123

第一列对应指定的 %%a ,后面的 %%b %%c 是派生出来的,对应其它列

分隔符指定为 - "空格",注意 delims=- 后面有个"空格"

其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的

for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b

取第2列给 %%a ,其后的列都给 %%b

 

38 subst (外部命令)

映射磁盘。

subst z: serverd #这样输入z:就可以访问serverd

subst z: /d #取消该映射

subst #显示目前所有的映时

 

39 xcopy (外部命令)

文件拷贝

xcopy d:mp3 e:mp3 /s/e/i/y

复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件

/i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问

 

你可能感兴趣的:(C++)