知识内容:

1.shell编程预备知识

2.shell变量

3.表达式与运算符

4.分支循环语句

5.函数

一、shell编程预备知识

1.什么是shell编程

shell是与linux交互的基本工具,是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,有两种执行命令的方式,如下所示:

  • 交互式,用户每输入一条命令,shell就解释执行一条
  • 批处理(batch),需要事先编写一个shell脚本,其中包含若干条命令,让shell一次将这些命令执行完

shell脚本及shell编程:当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序就被称为shell脚本,编写shell脚本的过程就称为shell编程

2.shell脚本的编写

(1)hello world

shell脚本一般可以使用vi编辑器或emacs编辑器编写,上述代码中第一行是声明脚本运行方式,在shell脚本中以#开头的为注释,不会被执行

(2)shell脚本的基本构成

运行结果如下:

以上代码的部分内容解释:

  • 以#开头的为注释
  • echo为输出语句,参数-n表示在显示信息时不自动换行
  • whoami命令字符串左右的反引号(`)用于命令替换(转换),也就是将它所括起来的字符串视为命令执行,并将其输出的字符串在原地输出

(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 脚本名

二、shell变量

1.变量类型

  • 用户自定义变量(局部变量):由用户在shell程序中自定义
  • 环境变量:系统环境中的一部分,不必去定义,可以在shell程序中使用,某些变量(如PATH)可以在shell中修改
  • 内部变量:linux系统提供的一种特殊类型的变量,此类变量在程序中用来做出判断

注:常见的内部变量

  1. $# 传送给shell程序的位置参数的数量
  2. $? 最后命令的完成码或在shell程序内部执行的shell程序的返回值
  3. $0 shell程序的名称
  4. $* 调用shell程序时所传送的全部参数组成的单字符串

2.变量赋值和访问

(1)变量定义及赋值

  • 变量定义:变量名=值
  • 变量赋值:变量2=$变量1

注:定义变量时变量名不需加$,在赋值符号两边不允许有任何空格;变量名由字母、数字、下划线组成,可以由字母和下划线开头

把一个命令的结果作为变量的内容赋值的方法:

  1. 变量名=`ls` # 不推荐使用这种方法,因为容易和单引号混淆
  2. 变量名=$(ls) # 把命令用$()括起来,推荐使用这种方法

(2)变量访问:在变量名前加上一个$

$变量名表示输出变量,可以用$c和${c}两种语法

注意在一些场合中访问变量值时必须为变量名加上花括号{}

注:如果不给此时的skill加花括号,解释器会将skillScript当成一个变量,由于没有为这个变量赋值,其值为空。所以在字符串给所以变量加上花括号是一个好的编程习惯!

(3)只读变量和删除变量

  • 使用readonly命令设置只读变量,只读变量的值不可改变
  • 使用unset命令删除变量,变量被删除后不能再次使用,unset不能删除只读变量

(4)添加环境变量

使用export命令将变量添加到环境变量中,作为临时的环境变量(一种全局变量)

基本语法:export 变量名=变量值

注:export命令仅将变量加到环境中,如果要从程序的环境中删除该变量,则可以使用unset命令或env命令,env也可以临时地改变环境变量值

3.内部变量

变量 含义
$0 脚本名
$1 -$9 位置参数1-9
${10} 位置参数10
$# 位置参数的个数
"$*" 所有位置参数(作为单个字符串)
"$@" 所有位置参数(每个作为单独字符串)
${#*} 传递到脚本中的命令行参数的个数
${#*} 传递到脚本中的命令行参数的个数
$? 返回值
$$ 脚本进程的PID
$- 传递到脚本中的标识
$_ 之前命令的最后一个参数
$! 运行在后台的最后一个作业的进程ID(PID)

4.位置参数

  • $0:获取当前执行的脚本文件名
  • $n:获取当前执行的脚本的第n个参数,n=1...9,当n>10时就要用大括号括起来,例如:${10}
  • $#:获取当前执行的脚本后面接的参数的总数
  • $*:获取当前执行的脚本所有传参的参数
  • $@:获取当前执行的脚本所有传参的参数

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.变量替换

变量替换根据变量的状态(是否为空是否定义)来改变它的值,使用花括号限定一个变量的开始和一个变量的结束

  • ${var}:替换为变量本来的值
  • ${var:-word}:如果变量var为空或已被删除,则返回word,但不改变var的值
  • ${var:=word}:如果变量var为空或已被删除,则返回word,并将var的值设置为word
  • ${var:?message}:如果变量var为空或已被删除,则将消息message发送到标准错误输出,可以用来检测变量var是否可以被正常赋值
  • ${var:+word}:如果var被定义,则返回word,但不改变var的值

7.数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似),与大部分编程语言类似,数组元素的下标由0开始

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:array_name=(value1 ... valuen)

数组实例:

三、表达式与运算符

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

四、分支循环语句

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

  • break:退出循环
  • continue:退出当前循环继续下次循环
  • exit:退出一个shell程序

另外上述3种都可以指定值,例如break [3]就是退出3层循环,continue [2]表示跳出2层循环,exit [2]表示指定退出值为2

五、函数

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 = "" ]
  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 = "" ]
  6. then
  7. echo ""
  8. else
  9. echo ""
  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)

linux操作系统5 shell编程的更多相关文章

  1. Linux下的Shell编程

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  2. Linux下的Shell编程(1)最简单的例子

    深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. 从第一行开始 我们可以使用任意一种文字编辑器编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #!/bi ...

  3. Linux操作系统之Shell程序设计

    Shell是种命令解释程序,也可以看作是一种命令语言的解释器. 用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行.Shell所使用的这种命令语 ...

  4. Linux 与 unix shell编程指南——学习笔记

    第一章    文件安全与权限 文件访问方式:读,写,执行.     针对用户:文件属主,同组用户,其它用户.     文件权限位最前面的字符代表文件类型,常用的如         d 目录:l 符号链 ...

  5. Linux学习之Shell编程基础

    转自:http://my.oschina.net/itblog/blog/204410 1 语法基本介绍1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来 ...

  6. linux下的Shell编程(3)shell里的流程控制

    if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...

  7. [No000014A]Linux简介与shell编程

    Linux 介绍 内核 库: .so 共享对象,windows:dll 动态链接库 应用程序 Linux的基本原则: 1.由目的单一的小程序组成:组合小程序完成复杂任务: 2.一切皆文件: 3.尽量避 ...

  8. Linux下的shell编程入门

    通常情况下,我们从命令行输入命令每输入一次就能够得到系统的一次响应.一旦需要我们一个接着一个的输入命令而最后才得到结果的时候,这样的做法显然就没有效率.要达到这样的目的,通常我们利用shell程序或者 ...

  9. linux学习总结----shell编程

    ## 环境变量 ## 全局变量 ``` 常见的全局环境变量 PATH 指令的搜索路径 HOME 用户的家目录 LOGNAME 登录名 SHELL 脚本的类型 使用全局环境变量 echo $PATH 自 ...

随机推荐

  1. Python CAN

    /********************************************************************************* * Python CAN * 说明 ...

  2. PR

    3.1音频轨道与播放 单声道音轨: 立体声音轨:立体声音频文件 3.2 音频过渡 需要先把第一段视频的结尾与第二段视频的开头切除,然后在使用恒定功率. 3.3  调音台的简单使用 调节音频: 显示声音 ...

  3. .NET/C# 项目如何优雅地设置条件编译符号?

    条件编译符号指的是 Conditional Compilation Symbols.你可以在 Visual Studio 的项目属性中设置,也可以直接在项目文件中写入 DefineConstants ...

  4. hdu 5311(暴力)

    题意:要求在一个字符串中找出三段,然后能拼成一个固定的单词,问是否可行 BC周年庆第二题,我枚举了那个单词的切断位置,然后到给的字符串里分别找,然后就没有然后了``` #include<stdi ...

  5. LG3369 【模板】普通平衡树

    题意 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多个相 ...

  6. 偶尔用得上的MySQL操作

    数据库编码 查看数据库编码 use xxx show variables like 'character_set_database'; 切换数据库编码 alter database xxx CHARA ...

  7. 感悟:Java新手一点想法

    在2年前写的博客,写的那么幼稚,工作了,工作经验多重要啊,有3年的开发经验,工资8000-12000 没接触Java框架之前,以为这些东西多神秘,多了不起,多高大上,其实也就那样 最重要的搞懂交互的流 ...

  8. gitlab使用笔记

    一.git环境搭建 1.百度gitlab,找到其官网,注册gitlab账号(需要打开FQ软件),登录. 2.点击Profile Settings,然后点击SSH Keys 3.虚拟机中执行:ssh-k ...

  9. day32 多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...

  10. day20 python sys os time json pickl 正则

    字符组 : [字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字.字母.标点等等. 假如你现在要求一个位置....9这10个数之一. 量词 几 ...