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

SHELL编程基本知识点一

[复制链接]

尚未签到

发表于 2018-8-30 09:49:52 | 显示全部楼层 |阅读模式
  SHELL编程基本知识点一
  1,起始点
  在每个脚本的开头都使用"#!",这意味着告诉你的系统这个文件的执行需要指定一个解
  释器.#!实际上是一个 2 字节[1]的魔法数字,这是指定一个文件类型的特殊标记, 换句话说, 在
  这种情况下,指的就是一个可执行的脚本.在#!之后接着是一个路径名.这个路径名指定了一个解释脚本中命令的程序,这个程序可以是 shell,程序语言或者是任意一个通用程序.这个指定的程序从头开始解释并且执行脚本中的命令(从#!行下边的一行开始),忽略注释.
  如:
  #!/bin/sh
  #!/bin/bash
  #!/usr/bin/perl
  #!/usr/bin/tcl
  #!/bin/sed -f
  #!/usr/awk -f
  2,条件表达式
  条件表达式用于    [[    复合命令以及内建命令    test    和    [    中,用来测试文件属性,进行字符串和算术比较。表达式使用下面的单目或二进制操作构造. 如果某操作的任何  file  参数的形式是  /dev/fd/n,那么将检查文件描述符n。如果某操作的file参数是 /dev/stdin, /dev/stdout 或者 /dev/stderr 之一,将分别检查文件描述符 0,1 和 2。
  [ -a FILE ]
  如果 FILE 存在则为真.
  [ -b FILE ]
  如果 FILE 存在且是一个块特殊文件则为真.
  [ -c FILE ]
  如果 FILE 存在且是一个字特殊文件则为真.
  [ -d FILE ]
  如果 FILE 存在且是一个目录则为真.
  [ -e FILE ]
  如果 FILE 存在则为真.
  [ -f FILE ]
  如果 FILE 存在且是一个普通文件则为真.
  [ -g FILE ]
  如果 FILE 存在且已经设置了SGID则为真.
  [ -h FILE ]
  如果 FILE 存在且是一个符号连接则为真.
  [ -k FILE ]
  如果 FILE 存在且已经设置了粘制位则为真.
  [ -p FILE ]
  如果 FILE 存在且是一个名字管道(F如果O)则为真.
  [ -r FILE ]
  如果 FILE 存在且是可读的则为真.
  [ -s FILE ]
  如果 FILE 存在且大小不为0则为真.
  [ -t FD   ]
  如果文件描述符 FD 打开且指向一个终端则为真.
  [ -u FILE ]

  如果 FILE 存在且设置了SUID (set user>  [ -w FILE ]
  如果 FILE 如果 FILE 存在且是可写的则为.
  [ -x FILE ]
  如果 FILE 存在且是可执行的则为真.
  [ -O FILE ]
  如果 FILE 存在且属有效用户ID则为真.
  [ -G FILE ]
  如果 FILE 存在且属有效用户组则为真.
  [ -L FILE ]
  如果 FILE 存在且是一个符号连接则为真.
  [ -N FILE ]
  如果 FILE 存在 and has been mod如果ied since it was last read则为真.
  [ -S FILE ]
  如果 FILE 存在且是一个套接字则为真.
  [ FILE1 -nt FILE2 ]
  如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真.
  [ FILE1 -ot FILE2 ]
  如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真.
  [ FILE1 -ef FILE2 ]
  如果 FILE1 和 FILE2 指向相同的设备和节点号则为真.
  [ -o OPTIONNAME ]
  如果 shell选项 “OPTIONNAME” 开启则为真.
  [ -z STRING ]
  “STRING” 的长度为零则为真.
  [ -n STRING ] or [ STRING ]
  “STRING” 的长度为非零 non-zero则为真.
  [ STRING1 == STRING2 ]
  如果2个字符串相同. “=” may be used instead of “==” for strict POSIX compliance则为真.
  [ STRING1 != STRING2 ]
  如果字符串不相等则为真.
  [ STRING1 < STRING2 ]
  如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真.
  [ STRING1 > STRING2 ]
  如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真.
  [ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.
  3,特殊字符
  #
  注释,行首以#开头为注释(#!是个例外). 注释也可以在本行空白的后边.
  ;
  命令分隔符,可以用来在一行中来写多个命令.
  ;;
  终止"case"选项.
  .
  .命令等价于 source 命令(见 Example 11-20).这是一个 bash 的内建命令.
  .作为文件名的一部分.如果作为文件名的前缀的话,那么这个文件将成为隐藏文件.
  .命令如果作为目录名的一部分的话,那么.表达的是当前目录.".."表示上一级目录.
  .字符匹配,这是作为正则表达是的一部分,用来匹配任何的单个字符.
  "
  部分引用" " 可引用除$、` 、\ 、外的任意字符或字符串," "中的变量能够正常显示变量值.
  '
  全引用' '与" "类似,不同在于shell会忽略任何的引用值.
  , 逗号链接了一系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被
  返回.
  如:let "t2 = ((a = 9, 15 / 3))"
  # Set "a = 9" and "t2 = 15 / 3"
  \ 转义字符,如\X 等价于"X"或'X'.
  / 文件名路径分隔符.或用来做除法操作.
  ` 后置引用,命令替换.
  :
  空命令,等价于"NOP"(no op,一个什么也不干的命令).也可以被认为与 shell 的内建命令
  (true)作用相同.":"命令是一个 bash 的内建命令,它的返回值为 0,就是 shell 返回的 true.
  如:
  :
  echo $?
  # 0
  死循环 如:
  while :
  do
  operation-1
  operation-2
  ...
  operation-n
  done
  # 与下边相同:
  while true
  do
  ...
  done
  在 if/then 中的占位符,如:
  if condition
  then : # 什么都不做,引出分支.
  else
  take-some-action
  fi
  在一个 2 元命令中提供一个占位符,具体见 Example 8-2,和"默认参数".如:
  : ${username=`whoami`}
  # ${username=`whoami`}
  如果没有":"的话,将给出一个错误,除非"username"是个命令
  使用"参数替换"来评估字符串变量.如:
  : ${HOSTNAME?} ${USER?} ${MAIL?}
  如果一个或多个必要的环境变量没被设置的话, 就打印错误信息.
  "变量扩展/子串替换"
  在和 > (重定向操作符)结合使用时,把一个文件截断到 0 长度,没有修改它的权限.
  如果文件在之前并不存在,那么就创建它.如:
  : > data.xxx
  #文件"data.xxx"现在被清空了.
  #与 cat /dev/null >data.xxx 的作用相同.然而,这不会产生一个新的进程,因为":"是一个内建命令.
  在和>>重定向操作符结合使用时,将不会对想要附加的文件产生任何影响.
  如果文件不存在,将创建.
  注意: 这只适用于正规文件,而不是管道,符号连接,和某些特殊文件.
  !
  取反操作符,将反转"退出状态"结果.也会反转 test 操作符的意义.比
  如修改=为!=.!操作是 Bash 的一个关键字.
  在一个不同的上下文中,!也会出现在"间接变量引用".
  在另一种上下文中,!还能反转 bash 的"history mechanism"
  需要注意的是,在一个脚本中,"history mechanism"是被禁用的.
  *
  万能匹配字符,用于文件名匹配(这个东西有个专有名词叫 file globbing),或者是正则
  表达式中.注意:在正则表达式匹配中的作用和在文件名匹配中的作用是不同的.
  *
  数学乘法.
  **是幂运算.
  ?
  测试操作.在一个确定的表达式中,用?来测试结果.
  (())结构可以用来做数学计算或者是写 c 代码,那?就是 c 语言的 3 元操作符的
  一个.
  在"参数替换"中,?测试一个变量是否被 set 了.
  ?在 file globbing 中和在正则表达式中一样匹配任意的单个字符.
  $
  变量替换;在正则表达式中作为行结束符.
  ${}
  参数替换
  $*,$@
  位置参数
  $?
  退出状态变量.$?保存一个命令/一个函数或者脚本本身的退出状态.
  $$

  进程>  ()
  命令组.如:
  (a=hello;echo $a)
  注意:在()中的命令列表,将作为一个子 shell 来运行.在()中的变量,由于是在子shell 中,所以对于脚本剩下的部分是不可用的.
  用在数组初始化,如:
  Array=(element1,element2,element3)
  {xxx,yyy,zzz...}
  大括号扩展,如:
  cat {file1,file2,file3} > combined_file
  # 把 file1,file2,file3 连接在一起,并且重定向到 combined_file 中.
  cp file22.{txt,backup}
  # 拷贝"file22.txt" 到"file22.backup"中
  一个命令可能会对大括号中的以逗号分割的文件列表起作用[1]. file globbing 将对
  大括号中的文件名作扩展.
  注意: 在大括号中,不允许有空白,除非这个空白是有意义的.
  echo {file1,file2}\ :{\ A," B",' C'}
  file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
  {}
  代码块.又被称为内部组.事实上,这个结构创建了一个匿名的函数.但是与函数不同的
  是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的.
  注意: 与()中的命令不同的是,{}中的代码块将不能正常地开启一个新 shell.
  {} \; 路径名.一般都在 find 命令中使用.这不是一个 shell 内建命令.
  注意: ";"用来结束 find 命令序列的-exec 选项.
  [] test.
  test 的表达式将在[]中.
  值得注意的是[是 shell 内建 test 命令的一部分,并不是/usr/bin/test 中的扩展命令的一个连接.
  [[]] test.
  test 表达式放在[[]]中.(shell 关键字)
  具体查看[[]]结构的讨论.
  [ ]
  数组元素
  Array[1]=slot_1
  echo ${Array[1]}
  [ ]
  字符范围
  在正则表达式中使用,作为字符匹配的一个范围
  (()) 数学计算的扩展
  在(())结构中可以使用一些数字计算.
  具体参阅((...))结构.
  >&>>&>><
  重定向.
  scriptname >filename 重定向脚本的输出到文件中.覆盖文件原有内容.
  command &>filename 重定向 stdout 和 stderr 到文件中
  command >&2 重定向 command 的 stdout 到 stderr
  scriptname >>filename 重定向脚本的输出到文件中.添加到文件尾端,如果没有文件,则创建这个文件.
  

运维网声明 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-558769-1-1.html 上篇帖子: shell脚本无密码登录 expect使用 下篇帖子: 数组在shell中用法案例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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