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

shell 基本知识

[复制链接]

尚未签到

发表于 2018-8-24 10:05:46 | 显示全部楼层 |阅读模式
  2、创建脚本文件
  [root@wzp ~]# cat test1
  #!/bin/bash
  date
  who
  通过创建编辑test1文件,具体内容如上
  #!/bin/bash指明了该文件所使用的shell
  [root@wzp ~]# ls -l test1
  -rw-r--r-- 1 root root 21 01-27 15:30 test1
  [root@wzp ~]# ./test1
  bash: ./test1: 权限不够
  如果直接运行该文件是无法执行的,因为shell脚本文件所在目录没添加到PATH环境变量中,我们可以通过echo $PATH查看。
  这里我们可以使用单点操作符。
  [root@wzp ~]# chmod u+x test1
  [root@wzp ~]# ./test1
  2011年 01月 27日 星期四 15:32:23 CST
  root     :0           2010-12-13 09:29
  root     pts/0        2011-01-27 15:12 (:0.0)
  3、显示消息
  [root@wzp ~]# echo welcome to 24 blog
  welcome to 24 blog
  如上正常显示
  [root@wzp ~]# echo welcome to 24' blog
  >
  如上字符出现单引号,则无法显示
  [root@wzp ~]# echo "welcome to 24' blog"
  welcome to 24' blog
  通过外围添加双引号使得正常显示
  [root@wzp ~]# echo 'welcome to "51cto" website'
  welcome to "51cto" website
  所以说在shell脚本中需要用到echo显示消息时注意单引号和双引号问题。
  [root@wzp ~]# cat test1
  #!/bin/bash
  echo -n "today is : "
  date
  echo "who logined this os :"
  who
  上面使用-n 参数可以使得echo命令结果和文本字符串在同一行
  [root@wzp ~]# ./test1
  today is : 2011年 01月 27日 星期四 15:49:08 CST
  who logined this os :
  root     :0           2010-12-13 09:29
  root     pts/0        2011-01-27 15:12 (:0.0)
  4、使用变量
  4.1 环境变量
  可以通过set命令显示活动环境变量的完整列表,如下通过echo单独显示一些$开头的变量:
  [root@wzp ~]# echo $LANG
  zh_CN.UTF-8
  [root@wzp ~]# echo $USER
  root
  [root@wzp ~]# echo $UID
  0
  [root@wzp ~]# echo $HOME
  /root
  如上可以看到我用的是root账号,还有字符编码类型,家目录
  [root@wzp ~]# cat test1
  #!/bin/bash
  echo user info for userid: $USER
  echo UID: $UID
  echo HOME DIR : $HOME
  echo LANG : $LANG
  [root@wzp ~]# ./test1
  user info for userid: root
  UID: 0
  HOME DIR : /root
  LANG : zh_CN.UTF-8
  如上可以总结出:使用美元符号开头的环境变量可以从脚本中引进这些环境变量
  但是,当我们只想要使用$符号的时候呢?怎么显示:
  [root@wzp ~]# echo $HOME
  /root
  [root@wzp ~]# echo /$HOME
  //root
  [root@wzp ~]# echo \$HOME
  $HOME
  上面的例子可以看出使用\反斜杠,那么shell脚本则将美元符号翻译成$,而不再是一个变量了,这点容易懂!
  4.2用户变量
  shell允许在脚本中设置和使用自己的变量,用户变量区分大小写,通过等号赋值给用户变量(=两边不准有空格)跟系统变
  量一样,用户变量也可以使用$引用:
  [root@wzp ~]# cat test1
  #!/bin/bash
  xxx1=ftp
  echo $xxx1 is 文件传输协议
  xxx2=http
  echo $xxx2 is 超文本标记传输协议
  [root@wzp ~]# ./test1
  ftp is 文件传输协议
  http is 超文本标记传输协议
  4.3反引号
  `这个符号就是反引号,在shell脚本之外很少使用它(通常处于键盘的1号键左边)反引号允许将shell命令的输出赋值给变
  量,在脚本编程中,它是主要的构建。如下例:
  [root@wzp ~]# cat test1
  #!/bin/bash
  testing=`date`
  echo the date and the time are : $testing
  [root@wzp ~]# ./test1
  the date and the time are : 2011年 01月 27日 星期四 20:13:17 CST
  如果上例没有使用反引号,那么现实的内容就是date这个字符而已了!
  再来一个现实比较常用的例子:
  [root@wzp ~]# cat test1
  #!/bin/bash
  testing=`date +%y%m%d`
  ls /usr/bin -al > log.$testing
  如上date +%y%m%d表示显示date命令的年月日,然后把$testing变量的值作为文件名,并且把/usr/bin下的文件目录都重定
  向到生产的文件中。(重定向下面会讲述)
  [root@wzp ~]# ./test1
  [root@wzp ~]# ll log.110127
  -rw-r--r-- 1 root root 97764 01-27 20:18 log.110127
  这样就很方便了,每天的日志文件自动区分出来,实现自动化!
  5、重定向输入输出
  有时候想通过命令保存输出,而不是显示在屏幕上,重定向就可以解决这个问题。
  5.1、输出重定向
  意思是说通过一条命令把显示的内容发送到文件中,通过>大于号实现,例子:
  [root@wzp ~]# date > test1
  [root@wzp ~]# cat test1
  2011年 01月 27日 星期四 20:26:08 CST
  [root@wzp ~]# who > test1
  [root@wzp ~]# cat test1
  root     :0           2011-01-27 20:07
  root     pts/0        2011-01-27 20:10 (:0.0)
  这个好理解,不多说。
  5.2、输入重定向
  输入重定向是输出重定向的相反过程,把一个文件的内容重定向到一个命令中,如:
  [root@wzp ~]# cat test1
  2011年 01月 27日 星期四 20:29:15 CST
  [root@wzp ~]# wc < test1
  1  6 43
  通过将文本文件重定向到wc命令中,可以算出这个文件的行数、单词数、字节数。
  如上表示test1文件有1行、6个单词和43个字节,这个很好懂吧!
  5.3、追加
  重定向的作用是完全覆盖,追加的概念就是在原本文件内容基础上添加,如:
  [root@wzp ~]# cat test1
  2011年 01月 27日 星期四 20:29:15 CST
  [root@wzp ~]# cal >> test1
  [root@wzp ~]# cat test1
  2011年 01月 27日 星期四 20:29:15 CST
  一月 2011
  日 一 二 三 四 五 六
  1
  2  3  4  5  6  7  8
  9 10 11 12 13 14 15
  16 17 18 19 20 21 22
  23 24 25 26 27 28 29
  30 31
  通过>>符号实现追加,可以看到date显示的内容还是没丢失。
  6、管道
  通过|这个符号实现管道过滤作用,这个很容易理解,比如在查看一些服务或者开放的端口,就可以通过管道过滤出我们想到
  查看的东西,而不是全部显示出来!
  [root@wzp ~]# rpm -qa |grep http
  httpd-2.2.3-22.el5
  httpd-manual-2.2.3-22.el5
  httpd-devel-2.2.3-22.el5
  [root@wzp ~]# netstat -antup |grep http
  tcp        0      0 :::80                       :::*                        L:ISTEN      4124/httpd
  tcp        0      0 :::443                      :::*                        LISTEN      4124/httpd
  这个就不多说了!
  7、数学计算
  处理数学的能力是编程语言至关重要的,可惜shell这方面不是很好。简单说说~
  7.1、expr命令
  expr命令可以处理命令行中的等式,在RHEL5.3下:
  [root@wzp ~]# expr 2*5
  2*5
  [root@wzp ~]# expr 2 * 5
  expr: 语法错误
  [root@wzp ~]# expr 2 \* 5
  10
  这样子在shell命令中使用expr命令就显得麻烦了。
  如下通过使用括号改进这个措施.
  7.2使用括号
  看下面这个例子,完全就是可以通过[]或者()替代了expr
  [root@wzp ~]# wzp1=$[1+5]
  [root@wzp ~]# echo $wzp1
  6
  先赋值,然后显示变量值。继续看看一个例子:
  [root@wzp ~]# cat test1
  #!/bin/bash
  var1=100
  var2=50
  var3=45
  var4=$[$var1 * ($var2 - $var3)]
  echo the final result is $var4
  [root@wzp ~]# ./test1
  the final result is 500
  通过[()]非常灵活的解决数学计算问题。当然,bash shell只是解决了整数运算。
  对于浮点算术运算,出现小数点的情况又是如何呢?
  7.3浮点解决方案
  首先看看一个例子:
  [root@wzp ~]# cat test1
  #!/bin/bash
  var1=100
  var2=45
  var3=$[$var1 / $var2]
  echo the final result is $var3
  [root@wzp ~]# ./test1
  the final result is 2
  我们可以看到,计算结果余数被忽略了,只是留下商。
  shell脚本可以通过使用Z shell(zsh)解决浮点算术运算,当然bash shell可以通过使用内置的bash计算器(称为bc)解决
  浮点运算问题。
  这里长话短说,直接在脚本用使用bc,具体要用到的时候在找解决方法。
  先看下面一个例子:
  [root@wzp ~]# cat test1
  #!/bin/bash
  var1=100
  var2=45
  var3='echo &quot;scale=4; $var1 / $var2&quot; | bc'
  echo the answer is $var3
  [root@wzp ~]# sh test1
  the answer is echo &quot;scale=4; $var1 / $var2&quot; | bc
  不知道为何,参加资料可以实现,我这里一直搞不定!先放着!!
  自己猜测应该是linux发行版问题~~~
  8、退出脚本
  每条运行在shell中的命令都使用一个退出状态,不过这点比较少弄,这个退出状态时一个介于0到255之间的数据,这个稍微
  了解下就行了!
  8.1、核对退出状态
  linux提供了 $? 这个特殊变量来保存最后一条命令执行结束的退出状态
  先看个例子:
  [root@wzp ~]# date
  2011年 01月 27日 星期四 22:39:58 CST
  [root@wzp ~]# echo $?
  0
  [root@wzp ~]# wzp
  bash: wzp: command not found
  [root@wzp ~]# echo $?
  127
  从上面看到date这个有效命令的退出状态值是0,而wzp这个无效命令的值是127
  具体还有其他退出状态值的数,可以自行参考下linux退出状态代码
  8.2退出命令
  在shell文本脚本中,可以自行设置退出状态值
  [root@wzp ~]# cat test1
  #!/bin/bash
  date
  exit 5
  [root@wzp ~]# ./test1
  2011年 01月 27日 星期四 23:13:42 CST
  [root@wzp ~]# echo $?
  5
  这个效果具体作用后续用到再说说了,这里点到为止了!


运维网声明 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-555848-1-1.html 上篇帖子: shell 中的 logger 下篇帖子: Linux中Shell的用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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