hyadijxp 发表于 2018-8-18 11:13:33

shell语言

  1.一些基本的shell命令
  (1)shell引用操作符:
  ‘’:单引号,禁止任何元字符转义,在‘’中的都作为普通字符a=1;echo '${a}'->${a}
  “”:双引号,只允许变量替代和命令替代${},$()a=1;echo "${a}"-> 1
  \   :元字符转义
  (2)shell变量扩展
  ${#variable}替换变量中字母的个数。如果*或者@,长度就是位置参量的个数
  ${va:-WORD}:当变量未定义或值为空时,输出值为WORD的,否则返回变量的值。
  ${va:=WORD}:当变量未定义或值为空时,输出WORD并将WORD字符串赋给va变量,否则返回变量值。
  ${va:+WORD}:当变量非空时,输出WORD,否则输出空。
  ${va:?MESSAGE}:当变量非空时,正常输出va的值。否则将消息MESSAGE送到标准错误输出(若此替换出现在SHELL程序中,那么该程序将终止运行)。
  符号含义:#左删除 %右删除 /替换 :取子串
  (2.1)删除子串
  var=http://www.linuxidc.com///test.htm
  1). # 最小左删除子串:从左向右最小匹配截取,删除左边字符,保留右边字符。
  例子:echo ${var#*//}
  说明:其中 var 是变量名,# 号是运算符,*// 匹配最小的左边字符串
  结果:www.linuxidc.com/test.htm
  2). ## 最大左删除子串:从左向右截取,删除左边字符,保留右边字符。
  例子:echo ${var##*/}
  说明:##*/ 在var中匹配最大字符串,删除左边字符,保留右边字符。
  结果:test.htm
  3). %最小右删除子串:从右向左匹最小匹配截取,删除右边字符,保留左边字符
  例子:echo ${var%/*}
  说明:在var中从右向左匹配最小字符串,删除右边字符,保留右边字符。
  结果:http://www.linuxidc.com//
  4). %% 最大右删除子串:从右向左匹最大匹配截取,删除右边字符,保留左边字符
  例子:echo ${var%%/*}
  说明:%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
  结果是:http:
  (2.2)取子串
  var=http://www.linuxidc.com///test.htm
  5). 左数取子串:从左边第几个字符开始,截取字符的个数
  例子:echo ${var:0:5}
  说明:其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
  结果:http:
  6). 左数至尾取子串:从左边第几个字符开始,一直到结束。
  例子:echo ${var:7}
  说明:其中的 7 表示左边第8个字符开始,一直到结束。
  结果:www.linuxidc.com/test.htm
  7). 右数取子串:从右边第几个字符开始,截取字符的个数
  例子:echo ${var:0-8:4}
  说明:其中的 0-8 表示右边算起第8个字符开始,4 表示截取的字符的个数。
  结果是:test
  8). 右数至尾取子串:从右边第几个字符开始,一直到结束。
  例子:echo ${var:0-8}
  说明:表示从右边第8个字符开始,一直到结束。
  结果是:test.htm
  (2.3)替换子串
  var=http://www.http.com///test.http
  9). 左数替换第一个子串:从左边起,只替换第一个匹配的子串。
  例子:echo ${var/http/ftp}
  说明:从左边起,替换第一个匹配的子串http为ftp
  结果:ftp://www.http.com///test.http
  10).全局替换子串:将匹配的字符全部替换为指定的子串
  例子:echo ${var//http/ftp}
  说明:将匹配的http字符全部替换为指定的ftp
  结果:ftp://www.ftp.com///test.ftp
  11). 左数替换第一个子串:从左边起,只替换第一个匹配的子串。
  例子:echo ${var/#http/ftp}等价于 echo ${var/http/ftp}
  说明:从左边起,替换第一个匹配的子串http为ftp
  结果:ftp://www.http.com///test.http
  12).右数替换第一个子串:从右边起,只替换第一个匹配的子串。
  例子:echo ${var/%http/ftp}
  说明:将匹配的http字符全部替换为指定的ftp
  结果:http://www.http.com///test.ftp
  (3)shell数学扩展
  $[ expression ]
  $(( expression ))
  echo $[ (5 + 3) * 2]
  16
  echo $(( 5 + 4 ))
  9
  []相当于test
  (())相当于let
  (4)shell重定向
  <重新定向输入
  >重新定向输出
  >>追加输出
  2>重新定向错误
  &>重新定向错误和输出
  >&重新定向错误和输出
  2>&1重新定向错误到标准输出
  1>&2重新定向标准输出到错误
  >|重新定向输出的时候覆盖noclobber
  filename如果是一个设备文件,就把这个文件作为标准输入和标准输出
  (5)文件压缩与备份
  gzip [-cdt#] 文件名
  -c 将压缩的数据输出到频幕上,可以通过数据流重导向来处理
  -d 解压缩
  -t 检验一个压缩的文件的一致性,看文件压缩后是否有错误
  -1 -9 -6 压缩等级,速度与压缩比例的权衡
  #gzip man.config压缩该文件成 man.config.gz
  #zcat man.config.gz    查看压缩文件.gz中的内容
  #gzip -d man.config.gz 解压缩该文件
  bzip2,bzip2 -d ,bzcat   bzip2的压缩、解压缩和查看命令,扩展名为.bz2
  tar 命令结合了gzip或bzip2的压缩功能
  tat [-cxtzjvfpPN] 文件或目录 ...
  -c 建立压缩文件的参数命令
  -x 解压缩文件的参数命令
  -t 查看tarfile里面的文件       (-cxt互斥)
  -v 过程可视化,显示在频幕
  -z 具有gzip属性,使用gzip压缩或解压缩
  -j 具有bzip2属性,使用bzip2压缩或解压缩
  -f 操作的文件名,带参数选项。
  -p 使用源文件的原来属性(属性不会更具用户而变)
  -P 可以使用绝对路径来压缩
  -N 比后面接的日期还要新的文件才会被打包
  tar -cvf /tmp/am.tar/am   将/am打包放到/tmp/am.tar里面,不压缩
  tar -zcvf /tmp/am.tar.gz/am   将/am打包放到/tmp/am.tar.gz里面,在以gzip压缩
  tar -ztvf /tmp/am.tar.gz查看压缩文件中的内容
  tar -zxvf /tmp/am.tar.gz解压
  dd if=文件名或设备of=文件名 bs=一个块的大小 count=块的个数       dd备份的目的是为了能恢复数据
  dd if=/etc/passwd of=/tmp/ps.bak   将一个文件备份,类似于cp
  dd if=/dev/hda of=/tmp/mbr.bakbs=512 count=1   读硬盘数据到文件,备份硬盘1个512字节大小块的数据
  dd if=/dev/hda1 of=/tmp/filename.bak             备份整个分区
  cpio是通过数据流重导向的方法,将文件输入/输出的一种方式。(通过重定向输入文件名来进行备份)
  cpio -covB>   备份
  cpio -icduv /dev/st0将数据备份到磁带机
  cpio -icdvt < /dev/st0   检查磁带机上存在的文件名
  cpio -icdvt < /dev/st0 >/tmp/contdir   将磁带机上的文件全部读入到/tmp/dontdir目录下
  (6)一些基本命令及操作
  (2)Set -x;set +x 打开/关闭命令调试的跟踪功能。stty -echo ;stty echo 关闭/打开自动打印输入字符
  (3)$展开运算符。${}变量展开;$()命令展开;$(())和$[]数学运算展开。
  (4)文件的类型有:d目录;l链接表;s套接字;b块设备;c字符设备;p管道
  (5)touch file 创建一个文件,cat file 创建文件
  (6)文件权限管理
  chmod 777 file ;修改文件属主、组、其他访问权限
  chown username file 改变文件属主
  chgrp newgrp file 改变文件组
  umask 000设置文件创建屏蔽字
  (7)ln -s src_pathdes_path创建文件链接
  (8)Cat file &;在后台运行该命令
  delete(line["lk"]) 删除数组中的某个元素
  (9)Read var1 var2 ... Varn 从终端读n个变量,以空格分隔
  read -a vp 把数据读到数组vp
  (10)Tee file;将管道数据保存在file中,并输出到终端
  (11)变量操作
  Uset var 清除变量 uset a
  Set 显示所有变量,包括环境变量
  Readonly 查看所有只读变量
  Export var 导出var为环境变量,如果需要在两个不同的脚步中使用相同变量,需要将该变量导出为环境变量
  (相当于C库函数的putenv())
  Env 显示所有环境变量
  一些环境变量:HOME,PATH,CDPATH,MAIL,EXINIT, LOGNAME,SHELL等
  位置变量:
  $?取命令的退出码,0为执行成功;
  $#命令后的参数个数;
  $n命令后的第n个参数
  $*命令后的所有参数
  $@命令后的所有参数
  $$当前进程号
  $0当前进程名
  $!后台运行的最后一个进程
  ${a} 返回变量a的字符串
  ${#a}求变量a的字符串长度
  (12).关于各种括号
  ():在子shell中执行一组命令,变量空间不同
  $()和${}:$是展开运算符。$()命令展开,相当于` `;${}变量展开
  []:相当于test;(()):相当于let,let “i=i+1”   ((i=i+1)); ((2>1))逻辑为true时,返回$?为0
  $(())和$[]:相当于expr和let
  let a=a+1
  (12)test测试和let测试
  一组命令[]: [ $x –gt $y ] ;[ "$name" = "" ]
  复合命令[[]]: [[ $name == om ]] 《=》name==Tom||name==tom;[[ $name == om && $friend == "Jose" ]]
  let命令和(()):专门测试数学表达式。 (( x > 2 ))   ; (( x == 2 && y == 3 ))
  (12)exit n 命令退出,0正常退出
  (13)|| 和 &&
  ||前面命令执行失败后才执行后面命令,否则后面命令不执行。
  &&前面命令执行成功后才执行后面命令,否则后面命令不执行。
  (14)>file清空文件内容
  (15)Basename filepath取文件基本名
  (16)Exec 的两个作用:
  1).执行命令    exec 命令
  2).为文件指定描述符
  exec 4>file1
  exec 3 Wednesday 10:29:21
  (26)Kill -l 列出所有的shell信号 及信号号
  (27)Eval 将一个字符串当做命令执行
  eval ‘cat test.txt’
  eval‘a=b’ 产生a变量
  (28)bc file 按行计算文件中的数学表达式,计算功能强大
  echo ‘2+3.14’ | bc
  (29)Su username 切换用户 sudo username 命令;在username模式下执行命令
  (30)Pstree 输出当前的进程树
  (31)怎样的命令适合在子shell中运行:
  会影响当前shell环境的命令,希望执行完该命令,shell的环境不变,如:
  (cd $dir; pwd) //这样命令执行完后,不会改变当前目录。 并且能将内容输出。
  ()命令表示在子shell中运行
  (32)cut 用于提取子串
  echo 'YYYYMMDD'| cut -c 1-4   //提取出YYYY
  (33)cal month year   输出某年某月的日历排布
  (34) ( ls; pwd; data ) > outputfile每个命令的输出都被送到名为outputfile的文件中,括号中的空格是必须的。
  (35)作业控制:
  jobs 查看当前所有进程的编号或状态
  fg 进程编号   将该进程提到前台并运行
  bg 进程编号   将该进程放到后台并运行
  ctl+Z暂停当前前台进程,并放入后台
  stop   暂停一个后台作业
  kill 进程编号将该进程杀死
  wait 进程编号等待该进程执行完
  (36)shell元字符与文件名通配-元字符
  *匹配零或多个字符
  ?匹配一个字符
  匹配一个字符集中的一个字符;如a、b或c
  [!abc]匹配一个字符集外的一个字符;如非 a、b或c
  {a,ile,ax}匹配一个字符或一个字符集
  [!a-z]匹配从a~z范围以外的字符
  \转义或禁止元字符
  2.文件名通配
  shell中支持模糊的文件名,通配符包括三种:*,?,[]
  *:通配文件名中的任何字符串,包括空
  ?:通配文件名中的任何一个字符
  []:通配[]中的任何一个字符
  [!...]:通配非[]中的字符
  ls *.doc   ;输出所有.doc文件
  ls f??*s;输出以f开头s结尾中间至少有2个字符的文件名。
  ls *;列出以i或o开头的文件
  ls*[!0-9]* ;列出不包括数字的文件
  3.Tr命令:处理行中指定的单个字符。(非正则匹配)
  tr 字符处理
  有4个选项:
  -t 缺省选项。替换 echo " liujin" | tr -t
  -s 压缩。echo "aabbcc" | tr -s
  -d 删除。echo "aabbcc" | tr -d
  -c 对模式取反。echo "abc" | tr -cd 删除除ab以外的字符
  例子:
  Tr -s ‘’
页: [1]
查看完整版本: shell语言