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

shell 脚本编程 【上】

[复制链接]

尚未签到

发表于 2018-8-25 13:52:23 | 显示全部楼层 |阅读模式
  shell 脚本编程 【上】
  程序就是指令加上数据组合而成
  程序编程风格:
  过程式:以指令为中心,数据服务于指令
  象式:以数据为中心,指令服务于数据
  编程语言:
  低级:汇编
  高级:
  编译:高级语言-->编译器-->目标代码 java,C#
  解释:高级语言-->解释器-->机器代码 shell, perl, python
  shell程序:提供了编程能力,解释执行
  shell脚本是包含一些命令或声明,并符合一定格式的文 本文件
  格式如下:
  首行shebang机制
  #!/bin/bash
  #!/usr/bin/python
  #!/usr/bin/perl
  那么shell脚本的用途有哪些呢?
  shell脚本可以有:
  自动化常用命令
  执行系统管理和故障排除
  创建简单的应用程序
  处理文本或文件
  如何创建脚本
  第一步:使用文本编辑器来创建文本文件  第一行必须包括shell声明序列:#! #!/bin/bash  添加注释 注释以#开头
  第二步:运行脚本  给予执行权限,在命令行上指定脚本的绝对或相对路径  直接运行解释器,将脚本作为解释器程序的参数运行
  例如:
  #!/bin/bash
  #author: wang
  #Version: 1.0
  #Description:This script displays some information about your
  当你写完一个脚本后你需要检查 而这时 你可以用到的查错命令有:
  1 bash -n /path/to/some_script
  检测脚本中的语法错误
  2 bash -x /path/to/some_script
  调试执行
  变量:命名的内存空间
  数据存储方式: 字符: 数值:整型,浮点型
  变量:变量类型
  作用: 1、数据存储格式 2、参与的运算 3、表示的数据范围
  类型: 字符 数值:整型、浮点型
  根据变量的生效范围等标准:
  本地变量:生效范围为当前shell进程;对当前shell之外 的其它shell进程,包括当前shell的子shell进程均无效 环境变量:生效范围为当前shell进程及其子进程 局部变量:生效范围为当前shell进程中某代码片断(通常 指函数) 位置变量:$1, $2, ...来表示,用于让脚本在脚本代码 中调用通过命令行传递给它的参数
  特殊变量:$?, $0, $*, $@, $#
  本地变量
  变量赋值:name=‘value’,  可以使用引用value:
  (1) 可以是直接字串; name=“root"
  (2) 变量引用:name="$USER"
  (3) 命令引用:name=`COMMAND`, name=$(COMMAND)
  变量引用:${name}, $name
  1 "":弱引用,其中的变量引用会被替换为变量值
  2 '':强引用,其中的变量引用不会被替换为变量值,而保 持原字符串
  显示已定义的所有变量:set
  删除变量:unset name
  环境变量
  变量声明、赋值: export name=VALUE declare -x name=VALUE
  变量引用:$name, ${name}
  显示所有环境变量: export env printenv
  删除:unset name
  bash有许多内建的环境变量:PATH, SHELL, USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1
  只读和位置变量
  只读变量:只能声时,但不能修改和删除 readonly name declare -r name  位置变量:在脚本代码中调用通过命令行传递给脚本的参数
  1 $1, $2, ...:对应第1、第2等参数,shift [n]换位置
  2 $0: 命令本身
  3 $*: 传递给脚本的所有参数,全部参数合为一个字符串
  4 $@: 传递给脚本的所有参数,每个参数为独立字符串
  5 $#: 传递给脚本的参数的个数
  6 $@ $* 只在被双引号包起来的时候才会有差异
  示例:判断给出的文件的行数 linecount="$(wc -l $1| cut -d' ' -f1)" echo "$1 has $linecount lines."
  shell中的简单的算术运算和逻辑运算
  bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方)
  实现算术运算:
  (1) let var=算术表达式
  (2) var=$[算术表达式]
  (3) var=$((算术表达式))
  (4) var=$(expr arg1 arg2 arg3 ...)
  (5) declare –i var = 数值
  (6) echo ‘算术表达式’ | bc
  乘法符号有些场景中需要转义,如* bash有内建的随机数生成器:$RANDOM(1-32767) echo $[$RANDOM%50] :0-49之间随机数
  逻辑运算
  true:1
  false:0
  与: 1 与 1 = 1
  1 与 0 = 0
  0 与 1 = 0
  0 与 0 = 0
  或:  1 或 1 = 1
  1 或 0 = 1
  0 或 1 = 1
  0 或 0 = 0
  非:!
  ! 1 = 0
  ! 0 = 1
  短路运算:
  短路与: 第一个为0,结果必定为0; 第一个为1,第二个必须要参与运算;
  短路或: 第一个为1,结果必定为1; 第一个为0,第二个必须要参与运算;
  异或:^ 异或的两个值,相同为假,不同为真
  赋值
  增强型赋值: +=, -=, *=, /=, %=
  let varOPERvalue
  例如:let count+=3 自加3后自赋值
  自增,自减:
  let var+=1
  let var++
  let var-=1
  let var-
  聚集命令
  有两种聚集命令的方法:
  复合式:date;  who |  wc  -l 命令会一个接一个地运行
  子shell:(date;  who | wc -l ) >>/tmp/trace 所有的输出都被发送给单个STDOUT和STDERR
  退出状态
  进程使用退出状态来报告成功或失败
  0  代表成功,1-255代表失败
  $? 变量保存最近的命令退出状态
  例如: $ ping -c1 -W1 hostdown &> /dev/null $ echo $?
  条件测试
  判断某需求是否满足,需要由测试机制来实现;
  专用的测试表达式需要由测试命令辅助完成测试过程;
  评估布尔声明,以便用在条件性执行中  若真,则返回0  若假,则返回1
  测试命令:  test EXPRESSION  [ EXPRESSION ]  ` EXPRESSION ` 注意:EXPRESSION前后必须有空白字符
  shell中条件性的执行操作符
  根据退出状态而定,命令可以有条件地运行
  1 && 代表条件性的AND  THEN
  2 ||  代表条件性的OR  ELSE
  例如: $ grep -q no_such_user /etc/passwd \ || echo 'No such user' No such user $
  ping -c1 -W2 station1 &> /dev/null \ > && echo "station1 is up" \ > || (echo 'station1 is unreachable'; exit 1) station1 is up
  test命令
  长格式的例子: $ test "$A" == "$B" && echo "Strings are equal" $ test “$A” -eq “$B” \ && echo "Integers are equal"
  简写格式的例子: $ [ "$A" == "$B" ] && echo "Strings are equal" $ [ "$A" -eq "$B" ] && echo "Integers are equal"
  bash的测试类型 有:
  1  数值测试
  2  字符串测试
  3  存在性测试
  4  文件权限测试
  5  文件大小测试
  6  双目测试
  数值测试:
  -gt: 是否大于;
  -ge: 是否大于等于;
  -eq: 是否等于;
  -ne: 是否不等于;
  -lt: 是否小于;
  -le: 是否小于等于;
  字符串测试:
  ==:是否等于;
  >: ascii码是否大于ascii码
  /dev/null
  Ping=`echo $?`
  [[ $Ping -eq  0 ]] && (echo "该IP地址可访问") || (echo "该IP地址不可访问")
  [root@localhost bin]# bash hostping.sh 10.1.25.29
  该IP地址可访问
  [root@localhost bin]# bash hostping.sh 10.1.25.155
  该IP地址不可访问
  10、chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写
  #!/bin/bash
  #
  (([ ! -r /tmp/flie1 ])  && ([ ! -w /tmp/file1 ])) && (echo "此用户对/tmp/file1文件不可读写" )
  11、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。
  #!/bin/bash
  #descrition:nologin and login
  [ -f /etc/nologin ] && (echo "normal user can not login")|| (touch /etc/nologin)
  12、
  写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,否,提示IP格式不合法并退出,是,
  测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
  #!/bin/bash
  #descrition:check ip
  echo $1 | egrep -o '([0-9]|([1-9][0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\>'&>/dev/null
  result=`echo $?`
  [ result -ne  0 ] && echo "it not ip" && exit 222
  ping -w1 -c1 "$1" &>/dev/null &&  (echo "you can access this ip") || (echo "you can not access this ip")
  13、计算1+2+3+…+100的值
  [root@qzx ~]# seq -s + 1 100 |bc
  5050
  14、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之
  #!/bin/bash
  #计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之
  [ $2 -gt $1 ] && (seq -s + $1 $2 | egrep -o '.*[^+]' |bc) || (echo "the number is wrong")
  [root@localhost bin]# bash  numA_B.sh 1 100
  5050


运维网声明 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.iyunv.com/thread-556446-1-1.html 上篇帖子: 来谈谈关于Shell中效率的问题 下篇帖子: shell 源码安装lamp 已测试!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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