【千锋教育 Linux高级程序设计教程】第1章 shell 编程

您所在的位置:网站首页 英语最高级后缀加什么 【千锋教育 Linux高级程序设计教程】第1章 shell 编程

【千锋教育 Linux高级程序设计教程】第1章 shell 编程

2023-06-09 15:48| 来源: 网络整理| 查看: 265

千锋教育 Linux高级程序设计教程第1章,字数12807,文末有18节视频课程。课程介绍:

千锋教育Linux高级程序设计课程。该课程将讲授有关网络传输数据的基本操作、常用的网络传输协议和原始套接字编程等。

学完本章能掌握什么:

掌握网络底层通信协议,通过分析通信过程和数据包达到对网络编程的深入理解,可以实现与网络相关的各项底层开发能力。

1、shell 概述

shell 的两层含义: 既是一种应用程序,又是一种程序设计语言。

1.1 作为应用程序

交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能称之为 shell 命令解析器 shell 是用户和 Linux 内核之间的接口程序。

用户在提示符下输入的命令都由 shell 先解释然后传给 Linux 核心,它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行 Linux 系统中提供了好几种不同的 shell 命令解释器,如 sh、ash、bash 等。一般默认使用 bash 作为默认的解释器。

我们后面编写的 shell 脚本,都是由上述 shell 命令解释器解释执行的。

shell 是用户跟内核通信几种方式的一种。

1.2 作为程序设计语言

它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支,完成类似于 windows 下批处理操作,简化我们对系统的管理与应用程序的部署,称之为 shell 脚本。

我们学过的 c/c++等语言,属于编译性语言(编写完成后需要使用编译器完成编译、汇编、链接等过程变为二进制代码方可执行) 。shell 脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装 shell 命令解释器的环境下执行。

shell 脚本主要用于: 帮助开发人员或系统管理员将复杂而又反复的操作放在一个文件中,通过简单的一步执行操 作完成相应任务,从而解放他们的负担。

shell 应用举例:

01《linux 常用命令_练习.txt》

我们前面完成了这个练习,步骤很多,其实我们只需要将所有操作写入一个文件——cmd.sh(名字跟后缀可任取,为了便于区分我们一般写为*.sh 形式) 然后: chmod +x cmd.sh./cmd.sh 直接执行即可

02假设我们要完成以下任务:

判断用户家目录下(~)下面有没有一个叫 test 的文件夹,如果没有,提示按 y 创建并进入此文件夹,按 n 退出 如果有,直接进入,提示请输入一个字符串,并按此字符串创建一个文件,如果此文件已存在,提示重新输入,重复三次自动退出,不存在创建完毕,退出简单的进行命令堆积无法完成以上任务,这就需要学习相应的 shell 脚本语法规则了。

shell 脚本大体可以分为两类: 系统进行调用 这类脚本无需用户调用,系统会在合适的时候调用,如:/etc/profile、~/.bashrc 等。/etc/profile 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,系统的公共环境变量在这里设置开始自启动的程序,一般也在这里设置 ~/.bashrc 。用户自己的家目录中的.bashrc 登录时会自动调用,打开任意终端时也会自动调用,这个文件一般设置与个人用户有关的环境变量,如交叉编译器的路径等等。

用户编写,需要手动调用的 例如我们上面编写的脚本都属于此类 无论是系统调用的还是需要我们自己调用的,其语法规则都一样。

2、shell 语法2.1 脚本的定义与执行 01. 定义以开头:#!/bin/sh #!用来声明脚本由什么 shell 解释,否则使用默认shell 02. 单个"#"号代表注释当前行 03. 执行: chmod + x test.sh ./test.sh 增加可执行权限后执行bash test.sh 直接指定使用 bash 解释 test.sh. test.sh(source test.sh) 使用当前 shell 读取解释 test.sh

三种执行脚本的方式不同点: ./和 bash 执行过程基本一致,后者明确指定 bash 解释器去执行脚本,脚本中#!指定的解释器不起作用 前者首先检测#!,使用#!指定的 shell,如果没有使用默认的 shell 用./和 bash 去执行会在后台启动一个新的shell 去执行脚本 用.去执行脚本不会启动新的 shell,直接由当前的 shell 去解释执行脚本。

例:1.sh

#!/bin/bash clear echo "this is the first shell script"

注意:如果是在 windows 通过 notepad++编辑脚本程序 需要用 vi 打开脚本,在最后一行模式下执行 :set ff=unix

2.2 变量

01自定义变量

定义变量 变量名=变量值

如:num=10 引用变量 $变量名

如:i=$num 把变量 num 的值付给变量 i 显示变量

使用 echo 命令可以显示 单个变量取值 echo $num 清除变量 使用 unset 命令清除变量 unset varname

变量的其它用法:

read string 从键盘输入一个字符串付给变量 string 。readonly var=100 定义一个只读变量,只能在定义时初始化,以后不能改变,不能被清除。 export var=300 使用 export 说明的变量,会被导出为环境变量,其它 shell 均可使用。注意:此时必须使用 source 2_var.sh 才可以生效 。

注意事项:

01变量名只能包含英文字母下划线,不能以数字开头

1num=10

错误 num1=20

正确 2

等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来;双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。

name=aa bb

//错误 name="aa bb"

//正确 echo "$name is me"

//输出:aa bb is me echo '$name is me'

//输出:$name is me

例 2: 2_var.sh

#!/bin/bash echo "this is the var test shell script " name="edu" echo "$name is me" echo '$name is me' echo "please input a string" read string echo "the string of your input is $string" readonly var=1000 #var=200 export public_var=300

02环境变量

shell 在开始执行时就已经定义了一些和系统的工作环境有关的变量,我们在shell 中可以直接使用$name 引用。 定义: 一般在~/.bashrc 或/etc/profile 文件中(系统自动调用的脚本)使用 export 设置,允许用户后来更改VARNAME=value ;export VARNAME 传统上,所有环境变量均为大写。

显示环境变量,使用 env 命令可以查看所有的环境变量。

清除环境变量,使用unset 命令清除环境变量。

常见环境变量:

HOME:用于保存注册目录的完全路径名。 PATH:用于保 存用冒号分隔的目录路径名,shell 将按 PATH 变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。 PATH=$HOME/bin:/bin:/usr/bin;export PATH HOSTNAME:主机名 SHELL:默认的 shell 命令解析器 LOGNAME:此变量保存登录名 PWD:当前工作目录的绝对路径名 ......

例:3_export.sh

#!/bin/bash echo "You are welcome to use bash" echo "Current work dirctory is $PWD" echo "the host name is $HOSTNAME" echo "your home dir $HOME" echo "Your shell is $SHELL"

03预设变量

$#:传给 shell 脚本参数的数量 $*:传给 shell 脚本参数的内容 $1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开$?:命令执行后返回的状态。 "$?"用于检查上一个命令执行是否正确(在 Linux 中,命令退出状态为 0 表示该命令正确执行,任何非 0 值表示命令出错)。 $0:当前执行的进程名 $$:当前进程的进程号。"$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复。

例:4_$.sh

#!/bin/bash echo "your shell script name is $0" echo "the params of your input is $*" echo "the num of your input params is $#" echo "the params is $1 $2 $3 $4" ls echo "the cmd state is $?" cd /root echo "the cmd state is $?" echo "process id is $$"

04脚本变量的特殊用法:"" `` ' \ () {}

""(双引号):包含的变量会被解释 ''(单引号):包含的变量会当做字符串解释 `(数字键 1 左面的反引号):反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量$ echo "today isdate` " today is 2012 年 07 月 29 日星期日 12:55:21 CST \转义字符:同 c 语言 \n \t \r \a 等 echo 命令需加-e 转义 (命令序列):由子 shell 来完成,不影响当前 shell 中的变量{ 命令序列 }: 在当前 shell 中执行,会影响当前变量。例:5varspe.sh 。

注意: “{”、“}”前后有一空格

#!/bin/bash name=teacher string1="good moring $name" string2='good moring $name' echo $string1 echo $string2 echo "today is `date` " echo 'today is `date` ' echo -e "this \n is\ta\ntest" ( name=student;echo "1 $name" ) echo 1:$name { name=student; echo "2 $name"; } echo 2:$name2.3 条件测试语句

在写 shell 脚本时,经常遇到的问题就是判断字符串是否相等,可能还要检查文件状态或进行数字测试,只有这些测试完成才能做下一步动作。

test 命令:用于测试字符串、文件状态和数字。

test 命令有两种格式: test condition 或[ condition ] 。使用方括号时,要注意在条件两边加上空格

shell 脚本中的条件测试如下:文件测试、字符串测试、数字测试、复合测试。测试语句一般与后面讲的条件语句联合使用。

01文件

文件测试:测试文件状态的条件表达式。

-e 是否存在-d 是目录-f 是文件 -r 可读-w 可写-x 可执行-L 符号连接-c 是否字符设备-b 是否块设备 -s 文件非空

例:6testfile.sh

#!/bin/bash test -e /dev/qaz echo $? test -e /home echo $? test -d /home echo $? test -f /home echo $? mkdir test_sh chmod 500 test_sh [ -r test_sh ] echo $? [ -w test_sh ] echo $? [ -x test_sh ] echo $? [ -s test_sh ] echo $? [ -c /dev/console ] echo $? [ -b /dev/sda ] echo $? [ -L /dev/stdin ] echo $?

02字符串

字符串测试 test stroperator “str” test “str1” stroperator “str2” [ stroperator “str” ] [ “str1”stroperator “str2”] 其中 stroperator 可以是: = 两个字符串相等 != 两个字符串不相等。

-z 空串

-n 非空串

例:7test_string.sh

#!/bin/bash test -z $yn echo $? echo "please input a y/n" read yn [ -z "$yn" ] echo 1:$? [ $yn = "y" ] echo 2:$?

03数字

测试数值格式如下: test num1 numoperator num2 [ num1 numoperator num2 ] num_operator 可以是: -eq 数值相等。

-ne 数值不相等 -gt 数 1 大于数 2 -ge 数 1 大于等于数 2 -le 数 1 小于等于数 2 -lt 数 1 小于数 2

例:8testnum.sh

#!/bin/bash echo "please input a num(1-9)" read num [ $num -eq 5 ] echo $? [ $num -ne 5 ] echo $? [ $num -gt 5 ] echo $? [ $num -ge 5 ] echo $? [ $num -le 5 ] echo $? [ $num -lt 5 ] echo $?

04复合测试

命令执行控制: &&: command1 && command2 &&左边命令(command1)

执行成功(即返回 0)shell 才执行&&右边的命令(command2) || command1 || command2 ||左边的命令(command1)未执行成功(即返回非0)shell 才执行||右边的命令(command2)

例: test -e /home && test -d /home && echo "true" test 2 -lt 3 && test 5 -gt 3 && echo "equal" test "aaa" = "aaa" || echo "not equal" && echo "equal"

多重条件判定

2.4 控制语句

01if 控制语句

格式一: if [条件 1]; then 执行第一段程序, else 执行第二段程序 fi

格式二: if [条件 1]; then 执行第一段程序 ,elif [条件 2];then 执行第二段程序,else 执行第三段程序 fi

例:9ifthen.sh

#!/bin/bash echo "Press y to continue" read yn if [ $yn = "y" ]; then echo "script is running..." else echo "stopped!" fi

02case 控制语句

case $变量名称 in “第一个变量内容”)

程序段一 ;; “第二个变量内容”)

程序段二 ;; *)

其它程序段 exit 1 esac

例:10_case1.sh

#!/bin/bash echo "This script will print your choice" case "$1" in "one") echo "your choice is one" ;; "two") echo "your choice is two" ;; "three") echo "Your choice is three" ;; *) echo "Error Please try again!" exit 1 ;; esac

例:10_case2.sh

#!/bin/bash echo "Please input your choice:" read choice case "$choice" in Y | yes | Yes | YES) echo "It's right" ;; N* | n*) echo "It's wrong" ;; *) exit 1 esac

03.for 控制语句

形式一: for (( 初始值; 限制值; 执行步阶 )) do 程序段 done

初始值:变量在循环中的起始值 限制值:当变量值在这个限制范围内时,就继续进行循环 执行步阶:每作一次循环时,变量的变化量。

declare 是 bash 的一个内建命令,可以用来声明 shell 变量、设置变量的属性。declare 也可以写作 typeset。declare -i s 代表强制把 s 变量当做 int 型参数运算。

例:11_for1.sh

#!/bin/bash declare -i sum for (( i=1; i

语言:shell脚本语言。必须复符合解析器的规则。

2、系统默认调用的两个脚本文件

/etc/profile ~/.bashrc

/etc/profile:对系统的所有用户都有效 用户登录系统的时候 执行。

~/.bashrc:对登录的用户有效 用户登录,打开终端。

3、写脚本的步骤

第一步:

第二步: 写脚本

第三步: 给脚本增加 可执行权限

第四步: 执行脚本文件

如果执行shell格式出错:

方式一:

方式二:

知识点2【shell的自定义变量】 1、定义变量2、shell的变量 获取键盘输入 3、只读变量4、脚本的变量导出为 环境变量

直接使用系统的环境变量

5、变量的注意事项

01、命名规则

变量名由字母、数值、下划线组成 不能以数值开头 不能是关键字。

02、变量使用时注意点

03、双引号、或单引号的区别

6、修改变量变量的值

案例:给PATH添加一个路径~/tool/opencv

知识点3【shell的预设变量】知识点4【shell脚本的特殊用法】""(双引号):包含的变量会被解释 ''(单引号):包含的变量会当做字符串解释 ``(数字键1左面的反引号):反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量 \ 转义字符: 同c语言 \n \t \r \a等 echo命令需加-e转义 (命令序列): 由子shell来完成,不影响当前shell中的变量 { 命令序列 }: 在当前shell中执行,会影响当前变量 知识点5【条件测试】1、条件测试的概述

语法1:使用关键字 test

语法2:使用[] 左右有空格

2、文件测试

文件测试:测试文件状态的条件表达式

-e 是否存在 -d 是目录 -f 是文件 -r 可读 -w 可写 -x 可执行 -L 符号连接 -c是否字符设备 -b是否块设备 -s 文件非空1 #!/bin/sh 2 test ‐e test.txt 3 echo "$?" #1 失败不存在 4 5 [ ‐e test.txt ] 6 echo "$?" #1 失败不存在 7 8 test ‐e a 9 echo "$?" #0 存在 10 11 [ ‐d a ] 12 echo "$?" #0 是文件夹 13 14 test ‐f a 15 echo "$?" #1 不是普通文件 16 17 [ ‐r a ] 18 echo "$?" #0 具备读权限 19 [ ‐w a ] 20 echo "$?" #0 具备写权限 21 [ ‐x a ] 22 echo "$?" #0 具备执行权限 23 24 test ‐s a.txt 25 echo "$?" #1 空文件 26 27 test ‐s b.txt 28 echo "$?" #0 非空文件3、字符串测试

test str_operator “str”

test “str1” str_operator “str2”

[ str_operator “str” ]

[ “str1” str_operator “str2”]

其中str_operator可以是:

= 两个字符串相等 != 两个字符串不相等

­z 空串 ­

n 非空串

4、字符串的操作扩展5、数值的测试

测试数值格式如下:

test num1 num_operator num2 [ num1 num_operator num2 ]

num_operator可以是:

-eq 数值相等 -ne 数值不相等 -gt 数1大于数2 -ge 数1大于等于数2 -le 数1小于等于数2 -lt 数1小于数26、数值的扩展7、复合测试

&&:

command1 && command2

&&左边命令(command1)执行成功(即返回0)shell才执行&&右边的命令 (command2)

|| command1

|| command2

||左边的命令(command1)未执行成功(即返回非0)

shell才执行||右边的命令 (command2)

案例:test -f test.c && test -r test.c && test -w test.c

知识点6【if控制语句】

格式一:

if [条件1]; then执行第一段程序 else执行第二段程序 fi

案例1:查看当前某个文件是否存在 如果存在查看文件内容 不存在 创建改文件,赋值内容输出内容

格式二:

if [条件1]; then 执行第一段程序 elif [条件2];then 执行第二段程序 else 执行第三段程序 fi

知识点7【case控制语句】

case $变量名称 in

“第一个变量内容”)

程序段一

;;

“第二个变量内容”)

程序段二

;;

*)

其它程序段

exit 1

esac

知识点8【for循环语句】

形式一:

for (( 初始值; 限制值; 执行步阶 ))

do

程序段

done

初始值:变量在循环中的起始值

限制值:当变量值在这个限制范围内时,就继续进行循环

执行步阶:每作一次循环时,变量的变化量

形式二:

for var in con1 con2 con3 ...

do

程序段

done

第一次循环时,$var的内容为con1

第二次循环时,$var的内容为con2

第三次循环时,$var的内容为con3

案例:扫描当前目录的文件

break跳出循环 continue直接进入下一次循环

知识点9【while循环语句】

while [ condition ]

do

程序段

done

当condition成立的时候进入while循环,直到condition不成立时才退出循环

until [ condition ]

do

程序段

done

这种方式与while恰恰相反,当condition成立的时候退出循环,否则继续循环

知识点10【函数】

有些脚本段间互相重复,如果能只写一次代码块而在任何地方都能引用那就提高了代码的可重用性。

shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。

定义函数的两种格式:

格式一:

函数名() {

命令 ...

}

格式二:

function 函数名() {

命令 ...

}

案例1:封装一个函数计算两个数据的和

案例2:函数分文件

18_shell.sh

17_shell.sh

晚上练习:【第1章 shell 编程 视频汇总】

【千锋Linux】01_shell自动调用的两个脚本

【千锋Linux】02_创建并执行shell

【千锋Linux】03_自定义shell变量

【千锋Linux】04_只读变量

【千锋Linux】05_环境变量

【千锋Linux】06_变量的注意事项

【千锋Linux】07_修改环境变量

【千锋Linux】09_脚本的特殊用法

【千锋Linux】10_文件测试

【千锋Linux】11_字符串测试

【千锋Linux】12_数值测试

【千锋Linux】13_复合测试

【千锋Linux】14_if控制语句

【千锋Linux】15_case控制语句

【千锋Linux】16_for循环语句

【千锋Linux】17_while循环语句

【千锋Linux】18_shell的函数



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3