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

shell初涉

[复制链接]

尚未签到

发表于 2018-8-23 11:08:06 | 显示全部楼层 |阅读模式
  一.概念:
  Shell俗称壳(用来区别于核),是一个命令行解释器,它接收用户命令,然后调用相应的应用程序。
  二.shell的种类:
  1.     sh(Bourne Shell):由Steve Bourne开发,各种UNIX系统都配有sh
  2.     csh(C Shell):由Bill Joy开发,随BSD UNIX发布,它的流程控制语句很像C语言,支持很多Bourne Shell所不支持的功能:作业控制,命令历史,命令行编辑。
  3.     ksh(Korn Shell):由David Korn开发,向后兼容sh的功能,并且添加了csh引入的新功能, 是目前很多UNIX系统标准配置的Shell,在这些系统上/bin/sh往往是指向/bin/ksh的符号链 接。
  4.     tcsh(TENEX C Shell):是csh的增强版本,引入了命令补全等功能,在FreeBSD、Mac OS X等系统上替代了csh。
  5.     bash(Bourne Again Shell):由GNU开发的Shell,主要目标是与POSIX标准保持一致,同 时兼顾对sh的兼容,bash从csh和ksh借鉴了很多功能,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。虽然如此,bash和sh还是有很多 不同的,一方面,bash扩展了一些命令和参数,另一方面,bash并不完全和sh兼容,有些行 为并不一致,所以bash需要模拟sh的行为:当我们通过sh这个程序名启动bash时,bash可以 假装自己是sh,不认扩展的命令,并且行为与sh保持一致。
  三.shell的运行过程:
  linux环境下,打开电脑,电脑就会运行bash。当我们进入终端时,bash会在当前目录下创建一个子
  shell(为了防止恶意命令使bash出错)。当我们输入命令时,子shell会先检测是否为内置命令,如果是,则直接执行,如果不是内置命令,而是普通命令时,子shell会创建一个子进程,在子进程中exec
  这个命令的二进制文件(但如果要执行的不是二进制文件,而是文本文件,并且第一行用Shebang(#! /bin/sh)指定了解释器,则子进程中exec解释器程序的代码,并且从解释器的_start开始执行,而这个文本文件被当作命令行参数传给解释器)。
  PS:shell内置命令只是shell进程中的一个函数。Shell的内建命令用man bash-builtins命令查看。
  四.shell变量:
  (1).概述:,Shell变量由全大写字母加下划线组成,shell变量分为环境变量和本地变量。
  环境变量:环境变量可以从父进程传给子进程。可以用printenv命令显示当前shell的环境变量。
  本地变量:只存在于当前shell进程。可以用set命令显示当前shell进程中定义的所有变量和函数。
  PS:环境变量是所有进程都有的,而本地变量是shell特有的。
  导出环境变量用的是export命令。(exprot VARNAME=value)(导出环境变量和定义环境变量可以一步完成)。
  用unset命令删除已定义的环境变量或本地变量。
  (2).变量引用:
  如果一个变量叫做VARNAME,用${VARNAME}可以表示它的值,在不引起歧义的情况下也可用$VARNAME表示它的值。
  如    echo ${VALNAME}
  (3).文件名替换:
  以下用于匹配的字符称为通配符(Wildcard),具体如下:
  * : 匹配0个或多个任意字符
  ? : 匹配一个任意字符
  [若干字符] : 匹配方括号中任意一个字符的一次出现
  例如:有bash.c    bbsh.c   bcsh.c     bdsh.c文件
  则执行    ls      *.c                        会显示所有.c文件
  ls      b?sh.c                 会显示上面的所有文件
  ls      b[abc]sh.c          会显示bash.c    bbsh.c      bcsh.c文件
  (4).命令行替换:
  `命令`   或   $( 命令)            (注:``为反引号,与~放在一起)
  Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。
  例如:value=`data`
  (5).算数替换:
  $((  算数运算  ))      用于算术计算,$((   ))中的Shell变量取值将转换成整数
val=10  
echo $(( $val + 3 ))
  注:注意空格,命令之间要有空格。
  常见的运算符:+,- ,*,  / ,% ,**(幂)
  算数运算还可以用let等命令:如    let   val=$val+3
  (6).转义字符:
  和C语言类似,\   在Shell中被用作转义字符。
  例如:创建一个 test c.c文件(test与c中间有空格)
touch test\ \c.c  还有一个比较特殊的符号,即  -   ,但想创建一个以-开头的文件时,shell解释器会把  -  当作选项提示符,此时即使用  \   转义也是不行的,因为它还是代表   -   的字面意思。所以可以用下面的方法:
touch ./-test.c  ./表示当前工作目录
  (7).单引号与双引号:
  和C语言不一样,Shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外, 但是字符串中不能出现单引号。
  双引号与单引号一样,只是有一下几种情况例外:
  $ 加变量名可以取变量的值\$表示示$的字面面值
  \`表示示`的字面面值
  \"表示示"的字面面值
  \\表示示\的字面面值 除以上情况之外u反引号仍表示命令替换
  \可以起转移字符的作用
  五.条件测试与循环语句:
  (1).    test  命令   或      [  命令 ]
  命令test或 [ 可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注意与C语言的逻辑表示正好相反)。
  [ -d DIR ] : 如果DIR存在并且是一个目录则为真
  [ -f FILE ] : 如果FILE存在且是一个普通文件则为真
  [ -z STRING ] : 如果STRING的长度为零则为真
  [ -n STRING ] : 如果STRING的长度非非零则为真
  [ STRING1 = STRING2 ] : 如果两个字符串相同则为真
  [ STRING1 != STRING2 ] : 如果字符串不相同则为真
  [ ARG1 OP ARG2 ] : ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)- ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等 于)之中的一个
  [ ! EXPR ] : EXPR可以是上面中的任意一种测试条件,  !表示示逻辑反
  [ EXPR1 -a EXPR2 ] : EXPR1和EXPR2可以是上面中的任意一种测试条件,-a表示示逻辑 与
  [ EXPR1 -o EXPR2 ] :EXPR1和EXPR2可以是上面中的任意一种测试条件,-o表示示逻辑 或
  (2).  if条件判断:
  格式为:
if 命令;then  
    命令
  
elif 命令;then
  
    命令
  
else
  
    命令
  
fi
  PS:  if和then为两条命令,放在同一行要以 ; 分开,then后面shell会自动续行,把下一条命令放在then后面当作一条命令,由于shell中没有和c语言一样的{ }(除函数一样外),所以要用fi表示if结束。
  :   是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真
  如:
if : ;then  
    echo 'hello'
  另外,Shell还提供了 && 和 ||  语法,和C语言类似,所以if 语句也可以这样写:
index=0  
[ index -le 10 ] && {
  
    echo 'hello'
  
    let index++
  
}
  

  

  

  
index=0
  
[ index -ge 10 ] || {
  
    echo 'hello'
  
    let index++
  
}
  这两个判断效果是一样的,都是打印11次hello
  PS:-a   与-o   是测试两个条件然后形成一个结果的,而&& 与  ||  则是测试两条命令的,两边都是一个独立的结果。
  (3).case与esac
  格式为:
case 条件 in  
    结果1)
  
    命令
  
    ;;
  
    结果2)
  
    命令
  
    ;;
  
esac
  因为shell是弱类型的,并且值是以字符串形式存储的,所以结果1/结果2等可以是字符串,通配符,字符等(c语言中只能匹配整数或字符常量),另外,每个匹配分支可以有若干 条命令,末尾必须以  ;;   结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳 到esac之后,不需要像C语言一样用break跳出。
  如:
read val  
case $val in
  
    a)
  
    echo 'this is a'
  
    ;;
  
    b)
  
    echo 'this is b'
  
    ;;
  
    *)
  
    echo 'all is right'
  
    ;;
  
esac
  (4).



运维网声明 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-555483-1-1.html 上篇帖子: shell---if语句 下篇帖子: shell---mysql备份
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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