SHELL编程(上)

一.首行要求:shebang机制

bash、python、perl的声明

二.shell脚本调试

bash -n :只检测脚本中的语法错误,但无法检查出命令错误,不执行脚本

bash -x  :调试并执行

常见三种脚本错误

语法错误:导致后续命令不继续执行,可以用bash -n检查错误,提示出错行数不一定准确

命令错误:默认后续命令还会继续执行,用bash -n无法检查,可以用bash -x进行观察

逻辑错误:只能用bash -x进行观察

三.变量

1.定义

变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据

2.变量类型

内置变量:例如PS1,PATH,UID,HOSTNAME,$$,BASHPID,$?,HISTSIZE

用户自定义变量

3.变量数据类型

字符

数值:整型,浮点型,bash不支持浮点数

4.Shell中变量命名法则

①不能使用程序中保留字和内置变量:如if,for

②只能使用数字,字母及下划线,且不能以数字开头(不支持短横线“-”)

③通俗易懂,不用简写

④统一命名规则

⑤变量名大写

⑥局部变量小写

⑦函数名小写

5.变量定义和引用

①赋值:    name='value'

value形式:

       直接字串   name=‘root’

       变量引用   name=‘$USER’

       命令引用   name=`COMMAND`   或   name=$(COMMAND)

注:变量赋值临时生效,退出终端后自动删除,脚本中变量随着脚本结束自动删除

②引用:      $name  或   ${name}

③显示已定义的所有变量:   set

④删除变量:    unset <name>

弱引用 "",其中的变量引用会被替换为变量值

强引用'',其中的变量引用不会被替换为变量值,而保持原字符串

6.环境变量

①声明和赋值

声明并赋值    export name=value  或    declare -x name=value

分两步           name=value 

                      export name

②引用

与普通变量一样:  $name${name}

③显示所有环境变量:

env 、  printenv  、 export 、  declare -x

④删除变量

unset name

附:bash内建环境变量

7.只读变量

只能声明定义,但后续不能修改和删除,即常量

①声明:

readonly name   或   declare -r name

②查看:

readonly [-p]   或   declare -r

8.位置变量

在bash shell中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数

清空所有位置变量:   set --

9.退出状态码变量

进程执行后,将使用变量$?保存状态码的相关数字,不同值反应成功或失败.取值范围为0-255

$? 的值为0代表成功

$?的值为1到255代表失败

用户可以在脚本中自定义退出状态码:    exit [n]

注:  脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字

       如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态         码

10.展开命令行

展开命令执行顺序:

变量扩展:

`` :反引号用于命令替换

\  :反斜线,禁止单个字符扩展

:叹号,命令历史替换

11.脚本安全和set

set命令可以用来定制shell环境,通过修改$-变量来控制shell环境

①$-变量

h  :hashall,打开选项后,shell会将命令所在的路径hash下来,避免每次都要查询.通过set +h关闭,set -h开启

i  :interactive-comments,交互式shell,脚本中i选项是关闭的

m  :monitor,监控模式,可以通过job control来控制进程的停止,继续,后台或者前台执行等

B  :braceexpand,大括号扩展

H  :history,打开H选项,可以展开历史列表中的命令,用!来完成,如:"!!"返回最近的一个历史命令,"!n"返回第n个历史命令

②脚本安全控制:

-u   :在扩展一个没有设置的变量时,显示错误信息,与set -o nounset等同

-e   :如果一个命令返回一个非0值(失败)就退出,与set -o errexit等同

-o   :option显示,打开或关闭选项

        set -o   显示选项

        set -o 选项x   打开选项x 

        set +o 选项x  关闭选项x

-x   :当执行命令时,打印命令及其参数,类似bash -x

四.格式化输出printf

常用格式替换符:

%s   字符串

%f   浮点格式

%b   对应参数中包含转义字符时,使用此替换符进行替换,对应转义字符会被转义

%c   ASCII字符,显示对应参数的第一个字符

%d,%i   十进制整数

%o   八进制整数

%u   不带正负的十进制值

%x   十六进制a-f

%X   十六进制A-F

%%   表示%本身

注:%#s  这种替换中#代表输出字符宽度,不足补空格,默认友对齐,%-10s   这种替换表示10个字符宽,左对齐(#右对齐补宽,-左对齐补宽)

常用转义字符:

\a   警告

\b   后退

\f   换页

\n   换行

\r   回车

\t   水平制表符

\v   垂直制表符

\     表示\本身

五.算术运算

shell允许在某些情况下对算术表达式进行求值,如let和declare内置命令,(())复合命令和算术扩展.求值以固定宽度的整数执行,不检查溢出.运算符及优先级,关联性和值与C语言相同

注:bash只支持整数,不支持小数

下列运算符优先级从高至低排列,同组优先级相等

*   /   %

+   -   #加减号

i++   i--

++i   --i

=   *=   /=   %=   +=   -=   <<=   >>=   &=   ^=   |=

- +   #正负号

! ~

**

<<   >>

<=   >=   <   >

==   !=

&

|

^

&&

||

expr?expr:expr

expr1,expr2\

实现算术运算:

随机数生成器变量:

六.逻辑运算

1. 对错:   truefalse

真为0,假为1

2.与:   &

全真为真,有假则假

3.或:   |

有真为真,全假则假

4.非:   !

!1=0 (真)      !0=1 (假)

5.异或:   ^

异或的两个值,相同为假,不同为真

6.短路与

7.短路或

七.条件测试命令

判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成

表达式执行若真,则状态码变量$?返回0

表达式执行若假,则状态码变量$?返回1

命令格式:

test EXPRESSION

[ EXPRESSION ]    #与上表达式等价

[[ EXPRESSION ]]

注意:EXPRESSION前后必须有空白字符

1.变量测试

2.数值测试

还有算术表达式的比较方式:

3.字符串测试

①test和[]用法

②[[]]用法

注:使用正则或通配符时使用[[]],其他情况一般用[]

4.文件测试

①存在性测试

-a file   同 -e,但是有缺陷,最好弃用

-e file   文件存在性测试,存在为真,否则为假

-b file   是否存在且为块设备文件

-c file   是否存在且为字符设备文件

-d file   是否存在且为目录文件

-f file   是否存在且为普通文件

-h file   -L file 是否存在且为符号链接文件

-p file   是否存在且为命名管道文件

-s file   是否存在且为套接字文件

②文件权限测试

-r file   是否存在且可读

-w file  是否存在且可写

-x file   是否存在且可执行

-u file   是否存在且拥有suid权限

-g file   是否存在且用户sgid权限

-k file   是否存在且拥有sticky权限

③文件属性测试

-s file   是否存在且非空

-t fd   文件描述符是否在某终端已经打开

-N file   文件自从上一次被读取之后是否被修改过

-O file   当前有效用户是否为文件属主

-G file   当前有效用户是否为文件属组

file1 -ef file2   file1是否是file2的硬链接

file1 -nt file2   file1是否新于file2

file1 -ot file2   file1是否旧于file2

八.关于()和{}

(cmd1;cmd2;...){ cmd1;cmd2;...; }都可以将多个命令组合在一起,批量执行

不同:   (list)会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境

            { list; }不会开启子shell,在当前shell中运行,会影响当前shell环境

*注意大括号中前后的空格*

九.组合测试条件

方式1:

注: -a 和 -o 需要使用测试命令进行,[[]]不支持

方式2:

十.用read命令接受输入

使用read把输入值分配给一个或多个shell变量,read从标准输入中取值,给每个单词分配一个变量,所有剩余单词分配给最后一个变量,如果变量名没有指定,默认标准输入的值赋值给系统内置变量REPLY

read [option] [name...]

-p   指定要显示的提示

-s   静默输入,一般用于密码

-n N   指定输入的字符长度N

-d '字符'   输入结束符

-t N   timeout为N秒

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 基础概念: 程序:指令+数据 程序编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务...
    Simon_Ye阅读 141评论 0 1
  • 1. shell脚本: 包含一些命令或声明,并符合一定格式的文本文件  格式要求:首行shebang(#!)机制...
    尛尛大尹阅读 1,887评论 0 1
  • 序 Shell脚本实在是太灵活了,相比标准的Java、C、C++ 等,它不过是一些现有命令的堆叠,这是他的优势也是...
    MrRobot阅读 2,037评论 0 2
  • 原文地址Shell是用户与Linux或Unix内核通信的工具,shell编程指的并不是编写这个工具,而是指利用现有...
    MrRobot阅读 11,845评论 5 30
  • 搭配《linux就该这样学》第四章内容 1.shell历史 Shell的作用是解释执行用户的命令,用户输入一条命令...
    木鱼_cc阅读 846评论 0 10