小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Computer & DL
  4. Linux
  5. 正文

《鸟哥的Linux私房菜》(基础篇)笔记整理(第12章)

2019年1月7日 1197点热度 0人点赞 0条评论

第十二章 学习shell script

一、什么是shell script

如下所示:

#!/bin/bash

#Program:

#     This program shows "Hello World!" in your screen/

#History

#2018/12/27      Xiaoao    First release

PATH=/bin:/sbin:usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

echo "Hello World! \a \n"

exit 0

一个shell script的基本组成:

(1)第一行的#i/bin/bash在声明这个script使用的shell名称。因为我们在使用bash,所以必须声明这一句话!

(2)除了第一行之外,其他都是在批注。要养成一个良好的写注释的习惯。要记录以下内容:

①script的功能;②script的版本信息;③script的作者和联系方式;④script的版权声明;⑤script的历史记录;⑥script内比较特殊的命令,使用绝对路径的方式来下达;⑦script运行时需要的环境变量预先声明和设定。

(3)主要环境变量声明。

(4)主要程序部分。

(5)执行结果告知(返回值)

二、简单shell script练习

1.script的执行方式差异

(1)利用直接执行的方式来执行script。在bash里面使用vim直接编写一个sh文件,然后直接“sh 文件名.sh”的情况下,script是在子程序的bash里面执行的,所以子程序完成后,子程序内各项变量或者动作会结束而不会传回到父程序中。

(2)利用source来执行脚本:在父程序中执行。这种执行方式是“source 文件名.sh”

三、善用判断式

1.使用test指令的测试功能

测试的标志 代表意义
1. 关于某个文件名的『文件类型』判断,如 test -e filename 表示存在否
-e 该『文件名』是否存在?(常用)
-f 该『文件名』是否存在且为文件(file)?(常用)
-d 该『文件名』是否存在且为目录(directory)?(常用)
-b 该『文件名』是否存在且为一个 block device 装置?
-c 该『文件名』是否存在且为一个 character device 装置?
-S 该『文件名』是否存在且为一个 Socket 文件?
-p 该『文件名』是否存在且为一个 FIFO (pipe) 文件?
-L 该『文件名』是否存在且为一个快捷方式?
2. 关于文件的权限检测,如 test -r filename 表示可读否 (但 root 权限常有例外)
-r 检测该文件名是否存在且具有『可读』的权限?
-w 检测该文件名是否存在且具有『可写』的权限?
-x 检测该文件名是否存在且具有『可执行』的权限?
-u 检测该文件名是否存在且具有『SUID』的属性?
-g 检测该文件名是否存在且具有『SGID』的属性?
-k 检测该文件名是否存在且具有『Sticky bit』的属性?
-s 检测该文件名是否存在且为『非空白文件』?
3. 两个文件之间的比较,如: test file1 -nt file2
-nt (newer than)判断 file1 是否比 file2 新
-ot (older than)判断 file1 是否比 file2 旧
-ef 判断file1与file2是否为同一文件,可用在判断hardlink的判定上。主要意义在判定,两个文件是否均指向同一个inode。
4. 关于两个整数之间的判定,例如 test n1 -eq n2
-eq 两数值相等 (equal)
-ne 两数值不等 (not equal)
-gt n1 大于 n2 (greater than)
-lt n1 小于 n2 (less than)
-ge n1 大于等于 n2 (greater than or equal)
-le n1 小于等于 n2 (less than or equal)
5. 判定字符串的数据
test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true
test -n string 判定字符串是否非为 0 ?若 string 为空字符串,则为 false。
注: -n 亦可省略
test str1 == str2 判定 str1 是否等于 str2 ,若相等,则返回 true
test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则返回 false
6. 多重条件判定,例如: test -r filename -a -x filename
-a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才返回 true。
-o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可返回 true。
! 反相状态,如 test ! -x file ,当 file 不具有 x 时,返回 true

2.利用判断符号[]

中括号的两段必须要有空格符来分隔。假设我空格键使用『□』符号来表示,那么,在这些地方你都需要有空格键:

[□"$HOME"□==□"$MAIL"□]

特别注意以下事项:

①中括号[]内每个足见都需要有空格键来分隔;

②中括号内的变量,最好都以双引号括起来;

③中括号内的长度,最好都以单或双引号括起来。

3.Shell script的默认变量

script针对参数已经有设定好一些变量名称了!对应如下

/path/to/scriptname  opt1  opt2  opt3  opt4

$0         $1    $2   $3    $4

执行的脚本文件名为$0这个变量,第一个接的参数就是$1。

还有一些特殊的参数可以做script中调用这些参数:

①$# :代表后接的参数『个数』,以上表为例这里显示为『 4 』;

②"$@" :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);

③"$*" :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字符,默认为空格键, 所以本例中代表『 "$1 $2 $3 $4" 』之意。

当你输入的参数里面有双引号的时候,必须要用“$@”来带入脚本之中,否则双引号会被取消。

(1)shift:造成参数变量变好偏移

以下程序为例:

[dmtsai@study bin]$ vim shift_paras.sh

#!/bin/bash

# Program:

#     Program shows the effect of shift function.

# History:

# 2009/02/17  VBird     First release

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

 

echo "Total parameter number is ==> $#"

echo "Your whole parameter is   ==> '$@'"

shift   # 进行第一次『一个变量的 shift 』

echo "Total parameter number is ==> $#"

echo "Your whole parameter is   ==> '$@'"

shift 3 # 进行第二次『三个变量的 shift 』

echo "Total parameter number is ==> $#"

echo "Your whole parameter is   ==> '$@'"

其运行及结果如下:

[dmtsai@study bin]$ sh shift_paras.sh one two three four five six <==六个参数

Total parameter number is ==> 6   <==最原始的参数变量情况

Your whole parameter is   ==> 'one two three four five six'

Total parameter number is ==> 5   <==第一次偏移,看底下发现one不见了

Your whole parameter is   ==> 'two three four five six'

Total parameter number is ==> 2   <==第二次偏移掉3次,two three four不见了

Your whole parameter is   ==> 'five six'

 

四、条件判断式

1.利用if…then

(1)单层、简单条件判断

格式如下:

if [ 条件判断式 ]; then

当条件判断式成立时,可以进行的指令工作内容;

fi   <==将 if 反过来写,就成为 fi 啦!结束 if 之意!

(2)多重、复杂条件判断

一个条件判断,分成功与失败进行:

if [ 条件判断式 ]; then

当条件判断式成立时,可以进行的指令工作内容;

else

当条件判断式不成立时,可以进行的指令工作内容;

fi

多个条件判断,分多种不同情况I星星

if [ 条件判断式一 ]; then

当条件判断式一成立时,可以进行的指令工作内容;

elif [ 条件判断式二 ]; then

当条件判断式二成立时,可以进行的指令工作内容;

else

当条件判断式一与二均不成立时,可以进行的指令工作内容;

fi

2.利用case…esac判断

这个方法类似于C语言中的switch…case。格式如下:

case  $变量名称 in   <==关键词为 case ,还有变数前有钱字号

"第一个变量内容")   <==每个变量内容建议用双引号括起来,关键词则为小括号 )

程序段

;;            <==每个类别结尾使用两个连续的分号来处理!

"第二个变量内容")

程序段

;;

*)                  <==最后一个变量内容都会用 * 来代表所有其他值

不包含第一个变量内容与第二个变量内容的其他程序执行段

exit 1

;;

esac                  <==最终的 case 结尾

 

3.利用fuction功能

function的语法是这样的:

function fname() {

程式段

}

function也是拥有局部变量的~他的局部变量与shell script很类似,函数名称代表示$0,而后续接的变量也是以$1,$2...来取代的~这里很容易搞错喔~因为『function fname(){程序段}』内的$0,$1...等等与shell script的$0是不同的

五、循环

1.while…do…done, until …do…done

while..do…done是当condition城里的时候,进行循环,直到condition的条件不成立时停止。

while [ condition ]  <==中括号内的状态就是判断式

do            <==do 是循环的开始!

程序段落

done          <==done 是循环的结束

当condition条件成立的时候终止循环,否则继续执行。

until [ condition ]

do

程式段落

done

2.for…do…done

已经知道要进行几次循环的状态,它的语法是:

for var in con1 con2 con3 ...

do

程式段

done

类似于C/C++中的for循环。

3.for…do…done的数值处理

这种方式更类似于C/C++中的for循环。格式如下:

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

do

程式段

done

三个字符串解释如下:

①初始值:某个变量在循环当中的起始值,直接以类似 i=1 设定好;

②限制值:当变量的值在这个限制值的范围内,就继续进行循环。例如 i<=100;

③执行步阶:每作一次循环时,变量的变化量。例如 i=i+1。

 

六、shell script的追踪和调试

进行debug的语法如下:

[dmtsai@study ~]$ sh [-nvx] scripts.sh

选项与参数:

-n:不要执行script,仅查询语法的问题;

-v:再执行sccript前,先将scripts的内容输出到屏幕上;

-x:将使用到的script内容显示到屏幕上,这是很有用的参数。

 

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: linux 鸟哥的linux私房菜
最后更新:2019年1月7日

davidcheung

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
已修:C++语言程序设计(基础篇)【清华大学】[2015-08-31] 行程安排调整:添加观赛项目0925 每日一感0920:相信自己·Belive myself 高考倒计时20天安排表(张玉帅) 《实时语音处理实践指南》第五章学习笔记 关于留学美国的一点想法
标签聚合
高中 Python 学习 生活 python学习 leetcode 算法 Java linux 鸟哥的linux私房菜
最近评论
davidcheung 发布于 5 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 5 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 9 个月前(10月20日) :wink:
niming 发布于 10 个月前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号