知识内容:linux
1.shell编程预备知识shell
2.shell变量编程
3.表达式与运算符数组
4.分支循环语句安全
5.函数bash
1、shell编程预备知识编程语言
1.什么是shell编程编辑器
shell是与linux交互的基本工具,是一个命令解释器,它的做用是解释执行用户输入的命令及程序等,有两种执行命令的方式,以下所示:函数
shell脚本及shell编程:当命令或程序语句不在命令行下执行,而是经过一个程序文件来执行时,该程序就被称为shell脚本,编写shell脚本的过程就称为shell编程工具
2.shell脚本的编写
(1)hello world
shell脚本通常可使用vi编辑器或emacs编辑器编写,上述代码中第一行是声明脚本运行方式,在shell脚本中以#开头的为注释,不会被执行
(2)shell脚本的基本构成
运行结果以下:
以上代码的部份内容解释:
(3)在shell脚本中包含外部脚本
1 . 脚本文件名 2 source 脚本文件名
实例:
注:上述代码中最后一行中的第二个.号表示当前目录
3.shell脚本的执行与调试
(1)执行
在命令行下直接执行:
1 chmod +x example 2 ./example [参数]
在指定的shell下执行脚本:
1 shell名称 脚本名 [参数] 2 sh hello.sh 3 bash hello.sh
(2)调试
1 bash -v 脚本名 2 bash -x 脚本名
2、shell变量
1.变量类型
注:常见的内部变量
1 $# 传送给shell程序的位置参数的数量 2 $? 最后命令的完成码或在shell程序内部执行的shell程序的返回值 3 $0 shell程序的名称 4 $* 调用shell程序时所传送的所有参数组成的单字符串
2.变量赋值和访问
(1)变量定义及赋值
注:定义变量时变量名不需加$,在赋值符号两边不容许有任何空格;变量名由字母、数字、下划线组成,能够由字母和下划线开头
把一个命令的结果做为变量的内容赋值的方法:
1 变量名=`ls` # 不推荐使用这种方法,由于容易和单引号混淆 2 变量名=$(ls) # 把命令用$()括起来,推荐使用这种方法
(2)变量访问:在变量名前加上一个$
$变量名表示输出变量,能够用$c和${c}两种语法
注意在一些场合中访问变量值时必须为变量名加上花括号{}
注:若是不给此时的skill加花括号,解释器会将skillScript当成一个变量,因为没有为这个变量赋值,其值为空。因此在字符串给因此变量加上花括号是一个好的编程习惯!
(3)只读变量和删除变量
(4)添加环境变量
使用export命令将变量添加到环境变量中,做为临时的环境变量(一种全局变量)
基本语法:export 变量名=变量值
注:export命令仅将变量加到环境中,若是要从程序的环境中删除该变量,则可使用unset命令或env命令,env也能够临时地改变环境变量值
3.内部变量
变量 | 含义 |
---|---|
$0 | 脚本名 |
$1 -$9 | 位置参数1-9 |
${10} | 位置参数10 |
$# | 位置参数的个数 |
"$*" | 全部位置参数(做为单个字符串) |
"$@" | 全部位置参数(每一个做为单独字符串) |
${#*} | 传递到脚本中的命令行参数的个数 |
${#*} | 传递到脚本中的命令行参数的个数 |
$? | 返回值 |
$$ | 脚本进程的PID |
$- | 传递到脚本中的标识 |
$_ | 以前命令的最后一个参数 |
$! | 运行在后台的最后一个做业的进程ID(PID) |
4.位置参数
5.变量值的输出与读取
(1)echo命令(加上-n选项表示不换行输出)
1 str="OK!" 2 echo $str # 直接输出指定的字符串 3 echo "$str This is a test" # 将变量混在字符串中输出 4 5 mouth=4 6 echo "2018-${mouth}-3" # 将变量混在字符串中输出若是要将变量和其余字符链接在一块儿,就要使用花括号进行变量替换
(2)printf命令
1 printf格式:printf 格式字符串 [参数列表...] 2 3 printf "hello! \n" 4 printf "%d %s\n" 100 "abc"
(3)read命令
1 read格式: read 变量 2 注:-p选项定义提示语句,-n选项对输入的字符进行计数,当输入的字符达到预约数目时自动退出,并将输入的数据复制给变量 3 4 read str 5 read -p "请输入两个数字" n1 n2
注:关于单引号、双引号、反引号的知识说明
单引号:关闭shell中全部的特殊符号使用和解释。说的简单点,就是单引号(‘ ’)中间的全部内容都做为普通的字符输出,就是说无论你是否是一些特殊的字符(如$,转移字符等)通通做为普通字符输出
双引号:关闭shell中的大部分的特殊字符,但保留部分,如$、转义字符\ (不包括\n \t等)、反引号(` `),而单引号(' ')则失效,做为普通字符输出
反引号:将反引号(` `)内的字符串看成shell命令来执行,返回值是命令的执行的结果,起到的是一个命令的替换做用
6.变量替换
变量替换根据变量的状态(是否为空是否认义)来改变它的值,使用花括号限定一个变量的开始和一个变量的结束
7.数组
数组中能够存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不须要定义数组大小(与 PHP 相似),与大部分编程语言相似,数组元素的下标由0开始
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式以下:array_name=(value1 ... valuen)
数组实例:
3、表达式与运算符
1.表达式
expr命令:是一款表达式计算工具,使用它完成表达式的求值操做
let命令:计算整数表达式的值
expr命令使用:
1 expr 5 +3 2 3 n=1 4 m=5 5 expr $n + $m 6 7 val=`expr 2 +2`
let命令使用:
1 n=1 2 m=5 3 let val=$n+$m 4 # 注意这种形式要求运算符和操做数之间不能有空格!
test命令:判断表达式的真假
1 test使用:test 逻辑表达式 2 test "abc"="xyz"
2.运算符
1 (1)算术运算: + - * / % = 2 3 (2)整数关系运算符: 4 -eq 相等 5 -ne 不等于 6 -gt 大于 7 -lt 小于 8 -ge 大于等于 9 -le 小于等于 10 11 (3)字符串检测运算符: 12 = 检测两个字符串是否相等,相等返回true 13 != 检测两个字符串是否相等,不等返回true 14 -z 检测字符串长度是否为0,为0返回true 15 -n 检测字符串长度是否为0,不为0返回true 16 str 检测字符串是否为空,不为空返回true 17 18 (4)文件测试运算符 - 省略 19 20 (5)布尔运算符 21 -a 与 两个表达式均为true才返回true 22 -o 或 有一个表达式为true才返回true 23 ! 非 表达式值为true返回false不然返回true
4、分支循环语句
1.if语句
(1)if结构
1 if [ 条件表达式 ] 2 then 3 语句序列 4 fi
注:条件表达式和[]之间必须有空格,不然会出现语法错误
if结构实例:
1 # !/bin/bash 2 a=1 3 b=2 4 if [ $a -lt $b ] 5 then 6 echo "a小于b" 7 fi
(2)if...else结构
1 if [ 条件表达式 ] 2 then 3 语句序列1 4 else 5 语句序列2 6 fi
if...else结构实例:
1 # !/bin/bash 2 a=1 3 b=2 4 if [ $a -lt $b ] 5 then 6 echo "a小于b" 7 else 8 echo "a不小于b" 9 fi
(3)if..elif...else结构
1 if [ 条件表达式1 ] 2 then 3 语句序列1 4 elif [ 条件表达式2 ] 5 then 6 语句序列2 7 elif [条件表达式3] 8 then 9 语句序列3 10 ... 11 else 12 语句序列n 13 fi
if..elif...else结构实例:
1 # !/bin/bash 2 a=1 3 b=2 4 if [ $a == $b ] 5 then 6 echo "a等于b" 7 elif [ $a -gt $b ] 8 then 9 echo "a大于b" 10 elif [ $a -lt $b ] 11 then 12 echo "a小于b" 13 else 14 echo "全部条件均不知足" 15 fi
2.case语句
1 case 值 in 2 模式1) 3 语句序列1 4 ;; 5 模式2) 6 语句序列2 7 ;; 8 ...... 9 模式n) 10 语句序列n 11 ;; 12 *) 13 其余语句序列 14 esac
实例:
1 # !/bin/bash 2 case $USER in 3 whxy) 4 echo "欢迎登陆" 5 ;; 6 root) 7 echo "超级管理员!" 8 echo "热烈欢迎" 9 ;; 10 *) 11 echo "欢迎 $USER !" 12 ;; 13 esac
3.循环语句
(1)while语句
1 while 测试条件 2 do 3 语句序列 4 done
实例:用while循环求1到100的和
1 # !/bin/bash 2 total=0 3 num=0 4 while [ $num -le 100 ] 5 do 6 total=`expr $total + $num` 7 num=`expr $num + 1` 8 done 9 echo "结果等于: $total"
(2)until语句
1 until 测试条件 2 do 3 语句序列 4 done
实例:用until循环求1到100的和
1 # !/bin/bash 2 total=0 3 num=0 4 until [ $num -gt 100 ] 5 do 6 total=`expr $total + $num` 7 num=`expr $num + 1` 8 done 9 echo "计算结果为: $total"
(3)for语句
1 for 变量 [ in 列表 ] 2 do 3 语句序列 4 done 5 6 eg: 7 # 循环输出 8 for var in 1 2 3 4 5 6 9 do 10 echo $var 11 done 12 13 # 显示主目录下的文件 14 for FILE in $HOME/*.* 15 do 16 echo $FILE 17 done
4.break和continue和exit
另外上述3种均可以指定值,例如break [3]就是退出3层循环,continue [2]表示跳出2层循环,exit [2]表示指定退出值为2
5、函数
1.函数的定义和调用
(1)函数的定义
1 [function] 函数名() 2 { 3 命令序列 4 [return 返回值] 5 }
function和return能够省略不写
(2)函数的调用
函数的调用:函数名 参数1 参数2 ...... 参数n
(3)实例
1 # !/bin/bash 2 Hello(){ 3 echo "Hello world!" 4 } 5 Hello # 调用函数
2.函数的返回值
(1)return
shell函数的返回值,能够和其余语言的返回值同样,经过return语句返回。
示例:
1 #!/bin/bash 2 function test() 3 { 4 echo "arg1 = $1" # 输出第一个参数 5 if [ $1 = "1" ] 6 then 7 return 1 8 else 9 return 0 10 fi 11 } 12 13 echo "test 1:" 14 test 1 15 echo $? # print return result 16 17 echo "test 0:" 18 test 0 19 echo $? # print return result 20 21 echo "test 2:" 22 test 2 23 echo $? # print return result
(2)echo
其实在shell中,函数的返回值有一个很是安全的返回方式,即经过输出到标准输出返回。由于子进程会继承父进程的标准输出,所以,子进程的输出也就直接反应到父进程。
示例:
1 #!/bin/bash 2 function test() 3 { 4 echo "arg1 = $1" 5 if [ $1 = "1" ] 6 then 7 echo "1" 8 else 9 echo "0" 10 fi 11 } 12 13 echo "test 1" 14 test 1 15 16 echo "test 0" 17 test 0 18 19 echo "test 2" 20 test 2
注:不能向标准输出一些不是结果的东西(也就是不能随便echo一些不须要的信息),好比调试信息,这些信息能够重定向到一个文件中解决,特别要注意的是,脚本中用到其它相似grep这样的命令的时候,必定要记得1>/dev/null 2>&1来空这些输出信息输出到空设备,避免这些命令的输出
3.函数的参数
1 shell中调用函数时能够向其传递参数,与脚本同样,在函数体内部是经过$n的形式来获取参数的值 2 好比$1表明第一个参数,$2表明第二个参数
4.函数实战
(1)计算阶乘
1 设计一个shell程序计算n的阶乘。要求: 2 从命令行接收参数n; 3 在程序开始后当即判断n的合法性,便是否有参数,如有是否为正整数,若非法请给错误提示; 4 最后输出计算的结果
代码实现:
(2)
(3)