设为首页 收藏本站
查看: 763|回复: 0

[经验分享] linux shell 高级(一)

[复制链接]

尚未签到

发表于 2018-5-25 07:45:01 | 显示全部楼层 |阅读模式
  一、 变量和运算符
  1.set命令 可以查看和设置本地变量
  2.readonly 查看本地只读变量
  readonly variable-name 设置变量为只读变量
  3.环境变量的设置在$HOME/.bash_profile (/etc/profile)中
  4.export variable-name=value 设置变量为环境变量
  5.env 查看所有环境变量
  6.变量替换:
  ${var-name}显示实际值到var-name
  ${var-name:+value}如果设置了var-name,则显示其值为value,否则为空
  ${var-nmae:?value}如果未设置var-name,显示用户定义错误信息value
  ${var-name:-value}如果未设置var-name,显示其值为value
  ${var-nmae:=value}如果未设置var-name,设置其值,并显示
  7.unset 取消变量
  8.位置变量
  $0       $1           $2           $3     $4
  脚本名   第一个参数 A   第二个参数 B   。。。。C   。。。。D
  注意:$10是表示第一个参数后面加上“0”,第10个参数可以通过shift命令得到
  可用shift 或者shift[n]来表示左移参数的位置
  shift与shift[1]相同,都是左移一个位置(从$1开始算,$0-脚本名是不会边的),如上图则$1的 值 为   B,$2的值为C......
  $# 参数的个数($0不算在内)
  $* 和 $@ 都是列出全部参数,下面举例说明它们的差异:
  比如在命令行中输入 ./test.sh A "B C" D
  则 $*和$@都为 A B C D
  但是如果用了软引用之后:
  "$@"可得到 "A" "BC" "D"三个字段
  而"$*"则得到"A B C D"一个字段
  9.标准变量(大部分都是环境变量):
  EXINIT:保存使用vi初始化选项,如EXINIT='set nu tab=4';exprot EXINIT
  IFS:域分隔符,默认是空格,可改边IFS=: 或 IFS=':'
  HOME:主目录
  LOGNAME:登录名
  MAILCHECK:每隔多长时间检查是否有邮件
  MAILPATH:用于多个邮箱时查看MAIL存储在哪几个文件中
  TERM:终端类型
  PATH:指定了当用户输入命令时linux搜索程序的目录由冒号:分隔,shell将按PATH中给出的顺序搜 索这些目录。找到的第一个与命令名称一致的可执行文件将被执行
  TZ:时区
  PS1:主提示符,其缺省值 '[\u@\h \w]\$ '
  u:用户 h:主机名 w:当前的目录。最后的"$"是普通用户的提示符,特权用户是"#"
  PS2:辅助提示符,一行中若需用多个命令时的提示符,缺省是">",如果用户在行末输入"\",然后 回车, 则会有改符号出现。
  PWD:当前运行的进程号
  $$:当前运行的进程号
  $!后台运行的最后一个进程的ID
  $- 显示shell使用的当前选项,与set相同
  $? 显示最后命令的退出状态,0表示没有错误,其他表示错误。
  10.影响变量的命令
  (1)declare   设置或者显示变量
  -f     只显示函数名
  -r     创建只读变量
  -x     创建转出变量
  -i     创建整数变量
  用+代替-可以颠倒选项的含义(r不能颠倒)
  (2)export 创建传给子shell的变量(创建环境变量)
  --表明选项结束,所有的后续参数都是实参
  -f表明在“名-值”对中的名字是函数名
  -n把全局变量转换成局部变量,命令的变量不再传给子shell
  -p显示全局变量列表
  (3)readonly 用于显示或者设置只读变量
  --表明选项结束
  -f创建只读变量
  (4)typeset   用于显示或设置变量,是declare的同义词
  (5)unset 取消变量的定义
  --表明选项结束
  -f删除只读变量(但不能取消从shell环境中删除指定的变量和函数,如PATH,PS1,PDID,EUID,PID,UID等)
  11.双引号:
  使用双引号可引用除字符$,`,\ 外的任意字符和字符串
  12.单引号:
  单引号与双引号不同的是shell会忽略任何引用值。换句话来说,如果屏蔽了其特殊含义,会将引号里所有的字符,包括引号作为一个字符串
  13.反引号:
  设置系统命令的输出到变量。shell将反引号里的命令的内容作为一个系统命令并执行其内容
  14.反斜杠:
  如果一个字符有特殊的意义,反斜杠可以屏蔽其含义,有特殊含义的字符有:& * + ^ $ ` " | ?
  15.运算符:
  按位运算符有:~ ,<<,>>,^>|,&
  $[ ]表示对方括号中的表达式求值 $[ 2+8 ].(注意[]内左右都必须留空格)
  $[ 2#111+1 ]=8 表示二进制的1111+1
  运算符的优先级
  以下级别高的优先级高
  13级:+,- (正负)
  12级:!,~ (逻辑非,按位取反)
  11级:*,/,% (乘,除,取摸)
  10级:+,- (加减)
  9级:<<,>>按位左移动,右移
  8级:<=,>=,<,> (小于等于,大于等于,小于,大于)
  7级:==,!= (等于,不等于)
  6级:& 按位与
  5级:^ 按位异或
  4级 | 按位或
  3级&& 逻辑与
  2级 || 逻辑或
  1级=,+=,-=,*=,/=,%=,|=,<<=,>>=
  二、Shell输入与输出
  1.echo 命令可以显示文本行或者变量,或者把字符串输入到文件
  echo [option] string
  -e 解析转义字符,
  转义符包括(
  \c,回车不换行
  \f,禁止
  \t,跳格
  \n)回车换行
  -n 回车不换行,linux系统默认回车换行
  2.read 从键盘或者文件的某一行文本中读如信息,并将其赋给一个变量
  read varible1 varible2
  如果只指定了一个变量,那么read将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车;如果给出了多个变量,它们按吮吸分别赋给不同的变量,。shell将用空格作为变量之间的分隔符
  举例说明:在shell脚本中有read A B C命令行,而在提示的命令行中输入1 2 3,则A=1,B=2,C=3
  3.cat 可以用来显示文件内容、创建文件,还可以用它来显示控制字符。
  cat |options|filename1..filename2...
  -v显示控制字符
  使用cat命令时要注意,它不会在文件分页符处停下来,它会一下显示完整个文件。如果希望每次显示一页,可以使用more命令或者把cat命令的输出通过管道传递给另外一个具有分页功能的命令(如more,less)中。
  cat命令举例:
  cat myfile1 myfile2 myfile3>myfile123;
  cat myfile123|more 分页显示
  cat -v dos.txt 会出现“^M”等控制字符,这是在windows下的编辑器留下的
  4.管道 可以通过管道把一个命令的输出作为另一个命令的输入
  举例说明:df -k |awk '{print $1}'|grep -v "Filesystem"
  df:显示所有文件系统对i节点和磁盘块的使用情况
  awk:浏览和抽取信息
  grep:文本过滤
  显示所有文件系统对i接点和磁盘块的使用情况信息中的第一列并不含有"Filesystem"的信息
  

  

  5.tee : 把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中
  tee -a file 这个命令一般用于管道之后。
  举例说明:
  cat file|tee file.out 将file中的信息输出到屏幕并拷贝到file.out中
  6.exec : exec命令可以用来代替当前shell;换句话说,并没有启动子shell,使用这一命令时任何现有环境都会   被清除,并重新启动一个shell
  exec command其中的command通常是一个shell脚本
  对文件描述符操作的时候(也只有在这时),它不会覆盖你当前的shell
  举例说明:
  exec **.sh 会重新登录并清除环境变量
  7.标准输入、输出和错误
  在shell中执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。
  文件         文件描述符
  输入文件----标准输入       0(缺省是键盘,也可以是文件或者其他命令的输出)
  输出文件---标准输出       1(缺省是屏幕,也可以是文件)
  错误输出文件--标准错误   2(缺省是屏幕,也可以是文件)
  系统中实际有12个文件描述符,可以任意使用文件描述符3-9
  8.文件重定向 改变程序运行的输入来源或输出地点
  command > filename 把把标准输出重定向到一个新文件中
  command >> filename 把把标准输出重定向到一个文件中(追加)
  command 1 > fielname 把把标准输出重定向到一个文件中
  command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中
  command 2 > filename 把把标准错误重定向到一个文件中
  command 2 >> filename 把把标准输出重定向到一个文件中(追加)
  command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)
  command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
  command < filename 把command命令以filename文件作为标准输入
  command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
  command <&m 把把文件描述符m作为标准输入
  command >&m 把把标准输出重定向到文件描述符m中
  command <&- 把关闭标准输入
  重定向的几个注意点:
  重定向中为保护原来的文件不被覆盖可以用 set -o noclobber 命令来限制
  用 set +o noclobber来取消限制,如果不取消的话也可以强制重定向
  command >| file
  cat <file>file 会清空file中的内容,因为shell会先清空stdout和stderr的管道。
  cat <file>>file会造成死循环,因为它是一行行读出来的,永远都没有结束符
  9.合并标准输出和标准错误
  合并标准输出和标准错误的时候,切记shell是用左至右分析相应的命令
  举例说明:
  grep "hi" test.txt >test.out 2>&1 标准输出和错误输出都输入到标准输出中
  10.使用文件描述符
  举例说明:
  exec 3<&0 0<name.txt   //设置3为标准输入 name.txt的内容输入到标准输入
  此时的exec不会清除环境变量,也不会重新登录,覆盖当前的sehll
  

  

  三、流控制结构
  1.if then else 语句
  if 条件1         #如果条件1为真
  then           #那么
  command1       #执行命令1
  elif 条件2       # 如果条件2为真
  then           #那么
  command2       # 执行命令2
  else           #如果条件1和条件2都不成立
  command3 执行命令3
  fi           #完成(if 语句一定要以fi结束)
  举例说明:
  if [ "13" -lt "11"]   #如果13小于11
  then         #那么
  echo "13<11"   #输出"13<11"
  elif["13" -lt "12"]   #如果13小于12
  then         # 那么
  echo "13<12"   #输出"13<12"
  else         #否则
  echo "13>=12"   #输出"13>=12"
  2.case语句
  case 值 in
  模式1)     #如果模式1匹配
  命令1     #执行命令1
  ;;
  模式2)     #如果模式2匹配
  命令2   #执行命令2
  ;;
  *)       #如果以上模式都不匹配
  命令3   #执行命令3
  ;;
  esac       #结束case语句
  case取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。模式匹配符号*表示匹配任意字符。[。。]表示类或者范围中的任意字符。
  举例说明:
  case $A in
  1)        #如果A的值为1
  echo "A =1"   #输出“A=1”
  ;;
  2)         #如果A的值为2
  echo "A=2"   #输出“A=2”
  ;;
  [34])       #如果A的值为3或4
  echo "A=3|4"   #输出“A=3|4”
  ;;
  esac       #结束
  3.for循环
  for 变量名 in 列表
  do
  命令1
  命令2
  done
  当变量值在列表里,for 循环即执行一次所有命令,使用变量名访问列表取值。命令可为任何有效的shell命令和语句。变量名为任何单词。in列表用法是可选的,如果不用它,for循环使用命令行的位置参数。in列表可以包含替换,字符串和文件名
  举例说明:
  for loop in 1 2 3 4 5         #在1 2 3 4 5列表中循环(5次)
  do               #开始执行命令
  echo "hello"          #执行命令
  done               #完成
  

  

  for loop in "one two three"     #当成一个元素只循环一次
  do
  echo $loop
  done               #输出 one two three 一行
  for loop in one two three     #三次循环
  do
  echo $loop
  done
  #输出 one
  two
  three
  列表可以是文件,如:for loop in `cat myfile`
  4.until循环
  until 条件
  do
  命令1
  命令2
  done
  条件可为任何测试条件,若刚开始条件就为真,则不执行循环。
  5.while循环
  while 命令
  do
  命令1
  命令2
  ......
  done
  举例说明:while read LINE <myfile   #每次读取myfile 中的一行
  do
  echo $LINE     #输出每行的信息
  done
  6.break控制
  break [n]            #跳出n层循环
  举例说明:
  for loop in 1 2 3
  done
  echo ${loop}
  for loop in one two three
  do
  echo ${loop}
  //break /break 2 /continue #这三个命令替换测试
  echo ${loop}+
  done
  done
  若为break,则输出 1 one 2 one 3 one
  若为break 2 则输出 1 one
  若为continue 则输出1 one two three 2 one two three 3 one two three (每次输出都有换行)注意:echo ${loop}+没有执行
  7.continue控制
  强制进入下一次循环 如上例子
  四、文本过滤
  1.正则表达式
  (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。
  (2)基本元字符集及其含义
  ^ :只匹配行首。   如^a 匹配以a开头的行abc,a2e,a12,aaa,......
  $ :只匹配行尾。   如^a 匹配以a结尾的行bca,12a,aaa,.......
  * :匹配0个或多个此单字符。 如(a)* 匹配 空,a,aa,aaa,....
  [] :只匹配[]内字符。可以是一个单字符,也可以是字符序列,用","将里面要匹配的不同字符串分开。也可以使用-来表示[]内字符序列的范围,如[1-5]表示[12345]
  \ :只用来屏蔽一个元字符的特殊含义。 如\*,\',\",\|,\+,\^,\. 等
  。:(点)只匹配任意单字符。
  pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数。如a\{2\}匹配aa.
  pattern\{n,\}:含义同上,但次数最少为n.如a\{2,\}匹配aa,aaa,aaaa,.....
  pattern\{n,m\}:含义同上,但次数在n和m之间。如a\{2,4\}匹配aa,aaa,aaaa三个
  (3)举例说明:
  ^$ :匹配空行
  ^.$ :匹配包含一个字符的行
  \*\.pas :匹配以*.pas结尾的所有字符或文件
  [0123456789]或[0-9] :假定要匹配任意一个数字
  [a-z] :任意小写字母
  [A-Za-z] :任意大小写字母
  [S,s] :匹配大小写S
  [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} :匹配IP地址 [0-9]\{3\}三个0-9组成的字符串;\. :匹配点(注意这里点是特殊的字符,所以要用"\"来屏蔽其含义)
  2.find介绍
  (1)查找具有某些特征文件的命令,可遍历当前目录甚至于整个文件系统来查看某些文件或目录,其遍历大的文件系统时一般放在后台执行。
  (2)find命令的一般形式
  find pathname -options [-print -exec -ok]
  -pathname :find命令所查找的目录路径。如用"."来表示当前的目录,用/来表示系统根目录
  -print :find命令将匹配的文件输出到标准输出
  -exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为
  'command'{} \; (注意{}和\之间的空格)
  -ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
  options有如下几种:
  -name :按照文件名查找文件
  -perm :按照文件权限来查找文件
  -user :按照文件属主来查找文件
  -group :按照文件所属的组来查找文件
  -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。
  -size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。
  -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在
  -newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件
  -depth 先查找指定目录有无匹配文件,若无则再在子目录中查找
  -type 查找某一类型的文件,如
  b :块设备文件
  d:目录
  e:字符设备文件
  p;管道文件
  l:符号链接文件
  f:普通文件
  (3)find命令举例
  find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上
  find /cmd ".sh" -print 查找/cmd目录下所有sh文件,并输出
  find . -perm 755 -print 查找当前目录下权限为755的文件,并输出
  find `pwd` -user root -print 查找当前目录下属主为root的文件,并输出
  find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件
  find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件
  find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件
  find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。
  find /var -type d -print 查找/var目录下所有目录
  find /var -type l -print 查找/var目录下所有的符号链接文件。
  find . -size +1000000c -print 查找当前目录下大于1000000字节的文件
  find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找
  find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件,若有则执行ls -l
  (4)xargs命令
  在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs的用处所在,特别是与find命令一起使用,exec会发起多个进程,而xargs会多个,只有一个
  find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理
  

  

  3.grep介绍
  (1)grep 的一般格式为 grep [options] 基本正则表达式 [文件]
  字符串参数最好采用是双引号括,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串
  -c:只输出匹配行的记数
  -i:不区分大小写(只适用于单个字符)
  -h:查询多个文件时不显示文件名
  -H:只显示文件名
  -l:查询多文件时只输出包含匹配字符的文件名
  -n:只显示匹配行及其行号
  -s:不显示不存在或无匹配文本的错误信息。
  -v:显示不包含匹配文本的所有行。
  (2)举例说明:
  grep ^[^210] myfile 匹配myfile中以非2、1、0开头的行
  grep "[5-8][6-9][0-3]" myfile 匹配myfile中第一位为5|6|7|8,第二位6|7|8|9,第三位为0|1|2|3的三个字符的行
  grep "4\{2,4\}" myfile 匹配myfile中含有44,444或4444的行
  grep "\?" myfile匹配myfile中含有任意字符的行
  (3)grep命令类名
  [[:upper:]]   表示[A-Z]
  [[:alnum:]]   表示[0-9a-zA-Z]
  [[:lower:]]   表示[a-z]
  [[:space:]]   表示空格或者tab键
  [[:digit:]]   表示[0-9]
  [[:alpha:]]   表示[a-zA-Z]
  如:grep "5[[:digit:]][[:digit:]]" myfile 匹配myfile中含有5开头接下去两位都是数字的行。
  

  

  4.awk介绍
  可以从文件或字符串中基于指定规则浏览和抽取信息,是一种自解释的变成语言。
  (1)awk命令行方式 awk [-F filed-spearator] 'command' input-files
  awk脚本:所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。awk脚本是由各种操作和模式组成。
  模式部分决定动作语句何时触发及触发事件。(BEGIN,END)
  动作对数据进行处理,放在{}内指明(print)
  (2)分隔符、域和记录
  awk执行时,其浏览域标记为$1,$2,...$n.这种方法成为域标识。$0为所有域。
  (3)举例说明:
  awk '{print $0}' test.txt |tee test.out 输出test.txt中所有行$0表示所有域
  awk -F : '{print $1} test.txt |tee test.out'   同上。。只是分隔符为":"
  awk 'BEGIN {print "IPDate\n"}{print $1 "\t" $4} END{print "end-of-report"}' test.txt
  开始时打印“IPDate”结束时打印“end-of-report”中间打印主体信息,比如总共匹配三条信息,则输出如下:
  IPDate
  1 first
  2 second
  3 third
  end-of-report
  (4)匹配操作符 ~ 匹配,!~ 不匹配
  cat test.txt |awk '$0~/210.34.0.13/' 匹配test.txt中为210.34.0.13的行
  awk '$0!~/210.34.0.13' test.txt   匹配test.txt中不是210.34.0.13的行
  awk '{if($1=="210.34.0.13") print $0}' test.txt 匹配 test.txt中第一个域为210.34.0.13的行。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-480785-1-1.html 上篇帖子: linux 恢复数据 下篇帖子: Linux高级(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表