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

Shell脚本编程知识点总结及范例

[复制链接]

尚未签到

发表于 2018-8-22 10:16:30 | 显示全部楼层 |阅读模式
  一:关于语言
  1)编译性语言
  编译型语言多半运作于底层,所处理的是字节、整数、浮点数或其它及其机器层经的对象。处理过程为:源程序--预处理--编译--汇编--链接,编译性语言为静态语言。
  2)解释性语言
  解释性语言读入程序代码并将其转化为内部的形式加以执行。处理过程:解释性(文本文件)-解释器去读取并执行。解释性语言为动态语言。
  二:基础
  变量类型
  linux脚本中的变量不需要事先声明,而是直接定义使用(这点不同于其他高级编程语言中变量的使用)bash变量类型分为本地变量和环境变量。
  本地变量:只对当前的shell有效,对其他shell及其子shell没效
  环境变量:对当前shell进程及其子shell有效,对其它的shell进程无效。
  位置变量:$1, $2, ..., ${10};$1为第一个输入的变量$0为函数的本身,
  特殊变量:$?
  特殊变量:$#和$@为总共输入变量的数量。  取用户输入参数的个数
  特殊变量:$*表示所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2;$@表示所有这些参数都分别被双引号引住
  变量的引用  " ":弱引用,里面的变量会被替换;
  ' ':强引用,里面的所有字符都是字面量,直接输出.
  自定义shell的状态返回值
  exit [n]
  自定义一个数的值
  declare -i a=0
  数值运算
  let num++  每成功执行一次自动添加一次。
  交互式编程
  read -p "输入说明: "  a
  -t :超时结束
  read -p "PLZ inpit you name: " -t 3  :请输入用户名,超时3秒结束输入。
  变量的赋值
  使用变量无需事先声明,同时变量名的命名须遵循如下规则:
  1)首个字符必须为字母(a-z,A-Z)
  2)中间不能有空格,可以使用下划线(_)
  3)不能使用标点符号
  4)不能使用bash里的关键字(可用help命令查看保留关键字)
  需要给变量赋值时可以使用:变量名=变量的值,要取用一个变量的值,只需在变量名前面加一个$ ( 注意: 给变量赋值的时候,不能在”=”两边留空格 )
  变量的赋值:var_name=var_value
  显示变量的值使用:echo $var_name
DSC0000.jpg

  另外我们可以将一个命令的的执行结果赋值给一个变量
DSC0001.jpg

  三:shell中括号的用法
  
  1)符号$后的括号
  ${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。
  $(cmd) 命令替换, 结果为shell命令cmd的输出, 和`cmd`效果相同, 不过某些Shell版本不支持$()形式的命令替换, 如tcsh。
  $((exp)) 和`expr exp`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。
  2)多条命令执行
  (cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。
  { cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
  对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。
  3)双括号的特殊用
  (()) 增强括号的用法, 常用于算术运算比较. 双括号中的变量可以不使用$符号前缀, 只要括号中的表达式符合C语言运算规则, 支持多个表达式用逗号分开。比如可以直接使用for((i=0;i /dev/null;then
  
    UserID= `id -u $1`  #用户存在,取用户的id号。
  
    echo "The User ID is $UserID"
  
  fi
  

  

  
  #! /bin/bash
  
  #
  
  if [ $1 -ge $2 ];then
  
    echo "the max num is $1"
  
  else
  
    echo "the max num is $2"
  
  fi
  

  
  #!/bin/bash
  
  # 取一串数值的最大值
  
  declare  -i num=0
  
  for i in $*; do
  
    if [ $num -lt $i ];then
  
      num=$i
  
    fi
  
  done
  

  

  
#根据命令成功与否当作执行条件,则if语句后必须跟命令本身且不能引用。
  

  
  if grep "^[[:space:]]*$" $1 &> /dev/null; then
  
     echo "$1 has $(grep "^[[:space:]]*$" $1|wc -l) blank lines."
  
  else
  
     eho "no blank lines"
  
  fi
  

  

  

  
#!/bin/bash
  
#
  
if [ $(id -u $1) -eq 0 ];then
  
   echo "admin"
  
elif[ $(id -u $1) -le 500 ];then
  
   echo "common user"
  
else
  
   echo "system user"
  
fi
  
#if后面只是测试条件
  
  测试条件:命令;命令是会被执行的,把执行的结果发送的>/dev/null ;系统会自动获得命令的执行状态返回值,状态返回值为0则说明条件满足了。非0则说明条件不满足。
  
  测试条件:比较表达式。[ 比较内容 ],中括号两边要有空格。
  2)case语句
  有多个测试条件时,case语句会使的语法格式更明细。
case  变量引用 in  
PATTERN1)
  
    分支1
  
    ;;
  
PATTERN2)
  
    分支2
  
    ;;
  
....
  
        *)
  
    分支n
  
   ;;
  
esac
  

  
PATTERN:类同于文件名统配,支持使用|表示或者。
  
  a|b: a或者b
  
  *:匹配任意长度的任意字符
  
  ?:匹配任意单个字符
  
  []:指定范围内的任意单个字符。


  •   #!/bin/bash
  •   #
  •   read -p "Plz enter a char: " char             #输入一个字符
  •   case $char in
  •   [0-9])                                     #判断是否为数字
  •   echo "a digit"
  •   ;;
      [a-z])                                     #判断是否为字母
  •   echo "a char"
  •   ;;
  •   *)
  •   echo "a special word"                     #其他显示special Word
  •   ;;
  •   esac
  八:循环语句
  for循环语句

  •   for语句的格式:
  •   for VAR_NAME in LIST
  •   do
  •   循环体
  •   done
  •   LIST:列表,中间包括一个或多个元素
  •   1:可以是 {起始值..结束值}  
      2:可以使用`seq 起始值 结束值` 或$(seq 起始值 结束值)
      
      3:还可以是命令(命令的执行可以得到一个列表)
  •   退出条件:遍历结束
  •   注意:for循环的条件是变量在列表中可以取到值,否则将不执行         循环体语句,同样for循环也可以嵌套使用
  •   for userNo in $(seq 1 5); do         #LIST为1-5个元素
  •   useradd user${userNo}             #添加用户user-user5
  •   done

  while循环语句

  •   while语句的格式:
  •   while 测试条件; do       #测试条件为真执行一次循环,退出条件为测试条件为假。
  •   循环体                #在循环体重不断改变着测试条件。
  •   done
  •   #!/bin/bash                              #求100以内所有整数的和
  •   declare -i count=1
  •   declare -i sum=0
  •   while [ $count -le 100 ]; do             #count的值小于等于100时执行下面的循环(为真执行)
  •   let sum+=$count
  •   let count++
  •   done
  •   echo $sum
  •   注意
  •   1:while循环是在条件满足时进入循环,当条件不满足时退出循环体
  •   2:循环体中须有让循环体自动的去判断条件语句的条件,否则循环将陷入死循环或者达不到我们预期的目的
  •   3:条件可以是个命令或者条件表达式
  
  until循环语句

  •   until语句的格式:
  •   until 测试条件; do    #测试条件为假时进入循环。
  •   循环体
  •   done
  •   #!/bin/bash                              #求100以内所有整数的和
  •   declare -i count=1
  •   declare -i sum=0
  •   until [ $count -gt 100 ]; do             #count的值大于100时不执行执行下面的循环(为真不执行)
  •   let sum+=$count
  •   let count++
  •   done
  •   echo $sum

  
  for 循环 中循环的内容要先生成然后保存到内存当中。对于大量的循环条件,要占用很多的内存。
  对于具体数字提前未知时,不便用for来来进行循环
  while 和until 必须要有退出条件
  break语句和continue语句

  •   循环控制:
  •   continue: 提前进入下一轮循环
  •   用于条件语句中,仅在某些个特殊场景提前进入;

  •   break [n]:跳出当前循环
  •   用于条件语句中,

  #!/bin/bash  
  #
  
  sum=0
  
  for i in {1..100};do
  
    if [ $[$i%3] -ne 0 ];then
  
       continue                                          #符合条件跳出循环。
  
    fi
  
    let sum+=$i
  
  done
  
  echo $sum
  

  

  

  
#!/bin/bash
  
#
  
read -p "PlZ enter a username: " userName                 #提示输入一个用户
  
while true; do                                            #while ture 始终为真一直循环
  
if who | grep "\" &> /dev/null; then         #如果用户来了执行break跳出循环
  
   break
  
fi
  
echo "not here."                                          #否则一直显示user not here
  
   sleep 5                                                # 睡5s执行一次循环
  
done
  
echo "$userName is logged on."
  
  
  函数

  •   形式一
  •   function F_NAME {
  •   函数体
  •   }
  •   形式二
  •   F_NAME() {
  •   函数体
  •   }

#/bin/bash  
#
  
dirName=/tmp/test
  

  
function createDir {       #定义函数为createDir
  

  
  if [ -d $dirName ];then
  
    echo "$dirName exits"
  
  else
  
    make $dirName
  
    echo "Create $dirName"
  
  fi
  
}
  
function main {
  
                        #定义函数在定义成main函数
  
  createDir
  
  createDir
  
}
  

  

  

  
可调用:使用函数名进行调用,函数名出现的地方,会被自动替换为函数;
  

  
函数的返回值:
  

  
函数的执行结果返回值:代码的输出
  
  函数中的打印语句:echo, print
  
  函数中调用的系统命令执行后返回的结果
  

  
执行状态返回值:函数的代码片段是否执行成功。
  
  函数体中最后一次执行的命令状态结果
  
  自定函数执行状态的返回值:return #
  

  
函数可以接受参数:
  
  在函数体中调用函数参数的方式同脚本中调用脚本参数的方式:位置参数
  
$1, $2, ...
  
$#, $*, $@
  
  
  信号捕捉trap

  •   trap 'COMMAND' SIGNALE ; SIGINT
  变量赋值操作

  •   ${variable:-string}
  •   variable为空或未设定,那么返回string,否则,返回variable变量的值;
  •   ${variable:=string}
  •   variable为空或未设定,则返回string,且将string赋值给变量variable,否则,返回variable的值;



运维网声明 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-554997-1-1.html 上篇帖子: shell监控脚本-准备工作 下篇帖子: linux shell及脚本编写,环境变量及重定向
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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