不正狼 发表于 2018-8-30 06:33:30

shell编程的语法知识点

  本节我们一起来看一下shell的编程,可能讲的不是非常全,希望大家可以一起讨论补充。
  我将根据以下几个步骤对shell的编程语法进行讲解:
  u 脚本简单介绍
  u 变量
  u 算术运算
  u 交互式编程
  u 选择判断
  u 条件测试
  u 循环
  u 函数
  脚本简单介绍
  在讲这些语法格式之前我们先对脚本进行简单的了解。
  1、书写格式
  第一行,顶格:以下为例
#!/bin/bash  
#!/usr/bin/python
  上边2个是两种不同编程语言的开头,一个是bash,一个是python,使用哪种语言开头这里就用哪种语言。
  其它的以#开头的行均为注释,会被解释器忽略。
  2、执行与检测
Bash   file  -n: 语法测试
#bash -n ping.sh    即对ping.sh进行语法检测,如不报错,则语法真确  -x: 模拟单步执行
#bash -xping.sh可以显示该脚本执行中的每个步骤  变量
  变量定义规则:
  1、不能使用程序中的关键字(保留字)
  2、变量名只能包含字母、数字、下划线,且不能以数字开始
  3、最好做到见名知意
  bash变量类别:
  1、本地变量:对整个脚本进程或整个bash进程有效。
  2、环境变量:当前shell进程及其子进程。
  3、局部变量:只对当前的代码段有效。
  4、位置变量:$n即为第n个位置变量      $1, ..., $n, ${10}
  5、特殊变量:bash内置的变量
  $?:上一个命令执行的返回值
  $#: 传递给脚本参数的个数
  $*
  $@:引用传递给脚本的所有参数
  变量的赋值
  格式:变量名=值
  VARNAME=VALUE
  变量引用:${VAR_NAME}
  双引号"":弱引用,里面的变量会被替换;
  单引号'' :强引用,里面的所有字符都是字面量,直接输出;
  变量的撤销:unset VAR_NAME
  算术运算
  算术运算:bash会对数字执行隐式的类型转换
  let VAR_NAME=Integer_Value
  declare -i Var_Name=Integer_Value
  注意:即使没有定义为整型变量,字符型的数字依然可以参与算术运算;bash会执行变量类型的隐式类型转换;
  运算操作符:+, -, *, /, %(取模), **(次方)
  bash的算术运算的方式:
  let Var_Name=EXPRESSION
  例如

  $
  例如

  $((EXPRESSION))
  例如

  命令:expr ARG1 OP ARG2
  例如

  交互式编程
  格式:read option “交互时的提示信息” 参数(交互时输入的值)
  option:
  -p :直接指定一个变量接受参数
  -t :timeout ,指定等待接受参数的时间
  下面我们来一个简单示例:创建一个脚本
#!/bin/bash  
#
  
read -p "Please input a user :" us
  
echo $us
  执行该脚本:会出现交互,我输入了一个hello.
# bash test5.sh  
Please input a user :hello
  
hello
  选择判断
  if语句
  (1)单分支的if语句:
  if 测试条件; then
  选择分支
  fi
  表示条件测试状态返回值为值,则执行选择分支;
  (2)双分支的if语句:
  if 测试条件; then
  选择分支1
  else
  选择分支2
  fi
  两个分支仅执行其中之一。
  练习:通过命令行给定一个文件路径,而后判断:
  如果此文件中存在空白行,则显示其空白行的总数;
  否则,则显示无空白行;

  我们对/etc/fstab文件进行测试

  注意:如果把命令执行成功与否当作条件,则if语句后必须只跟命令本身,而不能引用。
  (3)分支的if语句:
  if 条件1; then
  分支1
  elif 条件2; then
  分支2
  elif 条件3; then
  分支3
  ...
  else
  分支n
  fi
  练习:传:递一个用户名给脚本
  如果此用户的id号为0,则显示说这是管理员
  如果此用户的id号大于等于500,则显示说这是普通用户
  否则,则说这是系统用户;

  case语句
  当有多个测试条件时,case语句会使得语法结构更明晰
  用法格式:
  case 变量引用 in
  PATTERN1)
  分支1
  ;;
  PATTERN2)
  分支2
  ;;
  ...
  *)
  分支n
  ;;
  esac
  PATTERN:类同于文件名通配机制,但支持使用|表示或者;
  a|b: a或者b
  *:匹配任意长度的任意字符
  ?: 匹配任意单个字符
  []: 指定范围内的任意单个字符
  例如:用户键入字符后判断其所属的类别;

  条件测试
  条件测试根据比较时的操作数的类型可以分为以下3类:
  整型测试:整数比较
  字符测试:字符串比较
  文件测试:判断文件的存在性及属性
  整型测试
  格式:[ $num1 比较符 $num2 ]
  比较符
-gt大于-lt小于-ge大于等于-le小于等于-eq等于-ne不等于  字符串测试
  格式:[[ "$str1" 比较符 "$str2" ]]
  比较符:
  双目
  >
  <
  >=
  
页: [1]
查看完整版本: shell编程的语法知识点