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]