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

shell脚本相关问题

[复制链接]

尚未签到

发表于 2018-8-28 07:23:10 | 显示全部楼层 |阅读模式
  shell:解释执行用户输入命令,逐行解释,也可以批处理很多指令,可将这些指令全部编写到一个脚本文件中,让shell一次执行多条命令,常用的shell(bash,它承担shell这个角色,为shell脚本解释器,为一个可执行的二进制文件)
  shell的执行过程:
  用户在命令行输入命令后,一般情况下Shell会fork子进程并调用exec进行程序替换,让它的孙进程执行该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。如cd、export、umask、exit等命令即是内建命令
  具体步骤:
  1.交互Shell(bash)fork/exec一个子Shell(sh)用于执行脚本,父进程bash等待子进程sh终止。
  2.sh读取脚本中的cd ..命令,调用相应的函数执行内建命令,改变当前工作目录为上一级目录。
  3.sh读取脚本中的ls命令,fork/exec这个程序,列出当前工作目录下的文件,sh等待ls终止。
  4.ls终止后,sh继续执行,读到脚本文件末尾,sh终止。
  5.sh终止后,bash继续执行,打印提示符等待用户输入。
  eval:是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次
  用法:eval [参数]    eval可读取一连串的参数,然后再依参数本身的特性来执行。
  参数:参数行之前扫描它两次,再次运算求出参数的内容。
  1.用于回显简单变量:
DSC0000.png

  2.两次扫描,用于复杂变量显示,新建一个文本文件,显示该文本文件内容
DSC0001.png

  3.可获取最后一个参数
DSC0002.png

  4.用eval创建指针变量,也可以改变该指针所指空间的内容
DSC0003.png

  eval:不能获得函数处理结果 ,所有命令,函数的处理结果只能通过 ``来获得。eval 嵌套无意义 ,在其他语言中可以通过 eval(eval("code")),来执行(执行动态生成的code的返回),而由于shell 中 eval 将后面的eval命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。
  ` `与$()的区别与联系
  1.在有些情况下它们的用法相同,但它们之间也有区别
DSC0004.png

  如上例,显示当前时间时它们所获得的值是一样的,但获得当前目录所在主目录时,``将$的特殊意义转换出来了,而使用$()时并未解释出来,被\转义成了一个普通字符
  2.若给上例再加上一个/
DSC0005.png

  $()被转义成了一个字符串,并内解释出内容
  3.在test.sh脚本中编写如下内容
DSC0006.png

  如上,用反引号时,四个反斜杠被解释成了一个,而用$()时被解释成了两个
  4.使用多个反斜杠时
DSC0007.png

  由上可得:反引号本身就对\进行了转义,保留了其本身意思,如果想在反引号中起到\的特殊意义,必须使用两个\表示,$()使用时与平时一样 \=\
  [测试命令与[[]]的区别与联系
  1.[是一个可执行程序
DSC0008.png

  2.单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离
  当要测试时,bash回应参数太多了,是因为单引号TEST命令对变量进行单词分离了,结果也就变成了
  [ hello world = "hello world" ],多了那个字符串hello,成了字符串world和字符串hello world之间的比较了。因此如果在单括号的TEST命令的变量含有空格,但它还得和字符串比较,那就必须给变量加个双引号了,这时它就不会发生错误了。而在下面的双括号的TEST命令不能对变量单词进行分离
DSC0009.png

  3.单括号的TEST命令不对SHELL元字符进行扩展的,而双括号TEST命令则会对SHELL元字符进行扩展的了。
  4.在双括号的TEST命令中,如果一个字符串(不管含不含有空格)仅仅是在表达式作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。如果一个字符串值(右边那个的了)不加双引号,那这个字符串就是模式来的,如果它里面有含有SHELL元字符,BASH会对它进行扩展。如果字符串加了双引号,那它就是一个很普通的字符串的,即便字符串里面里面含有特殊字符,也就是当普通内容来处理。
  5.[ express1 –a express2 ] 这是放在单括号的TEST命令的,因为单的不支持元字符扩展,因此就只能叫做表达式了,它们可以组合构成逻辑测试的


运维网声明 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-557453-1-1.html 上篇帖子: shell脚本下的双 [ [ ] ]和单[ ]的联系和区别 下篇帖子: shell脚本应用(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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