vike681 发表于 2018-8-25 13:52:23

shell 脚本编程 【上】

  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 换位置
  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 && 代表条件性的ANDTHEN
  2 ||代表条件性的ORELSE
  例如: $ 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 -eq0 ]] && (echo "该IP地址可访问") || (echo "该IP地址不可访问")
  # bash hostping.sh 10.1.25.29
  该IP地址可访问
  # 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 '(|()|(1{2})|(2)|(25))\.(|()|(1{2})|(2)|(25))\.(|()|(1{2})|(2)|(25))\.(|()|(1{2})|(2)|(25))\>'&>/dev/null
  result=`echo $?`
  [ result -ne0 ] && 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的值
  # 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")
  # bashnumA_B.sh 1 100
  5050

页: [1]
查看完整版本: shell 脚本编程 【上】