SHELL脚本编程

编程基础

程序:

       程序:算法+数据结构

       数据:程序的核心

       数据结构:数据在计算机中的类型和组织方式

       算法:处理数据的方式

编程风格:

       过程式:以指令为中心,数据服务于指令

       对象式:以数据为中心,指令服务于数据

程序的执行方式:

       计算机:执行二进制指令

       编程语言:

              低级编程语言:

                     机器:二级制序列,机器指令

                     汇编:采用一些助记符号替代机器指令

              高级编程语言:

                     编译型:高级语言->编译器->机器代码->执行(C,C++等)

                     解释型:高级语言->执行->解释器->机器代码(python,shell等)

编译型和解释型语言

编程基本概念:

       逻辑处理:顺序执行、循环执行、选择执行

       基本结构:相关语句、数据存储、表达式

SHELL脚本基础

脚本规范:

       首行shebang机制(#!),声明脚本所调用的语言

       后续应包括以下内容:程序名、版本号、更改时间、作者相关信息、相关协议等

shell脚本用途:

       自动化常用命令

       执行系统管理和故障排除

       创建简单的应用程序

       处理文本或文件

shell脚本结构:

       #!shebang                       (shebang机制)

       Configuration_Variables      (参数变量)

       Function_Definition             (函数定义)

       Main_Code                         (主要代码)

shebang机制:

       shebang= #(sharp) + !(bang)

        #! +解释器绝对路径:用于指明执行这个脚本文件的解释器。

变量

相关概念:

       定义:变量即命名的内存空间,指明存放数据的地址(门牌号)。

       强类型:需要经过函数强制转换才能改变数据类型(Java、python等)

       弱类型:与严峻形势会隐式做数据类型转换,无需指定,默认为字符型(bash等)

       命名法则:

              不能使用程序保留字,如if、for等

              只能使用数字、字母和下划线,且不能以数字开头

              统一命名规则:驼峰命名法、下划线分隔命名

bash变量:

bash变量

                                      *只读变量:只能声明,但不能修改和删除。

                                                     声明:readonly name或declare –r name

                                                     查看:readonly -p

        相关命令:

                     显示变量:set(局部);env、export、declare –x、printenv(全局)

                     删除变量:unset name;set --(清空所有位置变量)

bash退出状态

        退出状态码:0代表成功;1-255代表失败(使用$?查看最近命令的退出状态)

        自定义退出状态码:exit

        num(不超过255)

        *脚本一旦遇到exit命令,会立即终止,退出状态取决于exit命令后的数字;如果未给脚本指定退出exit命令,脚本退出状态码取决于脚本执行的最后一条命令的状态码。

        *执行脚本一般直接写脚本名称或bash脚本,不使用source或. 执行,因为当脚本中存在exit命令时后两种执行方式会注销,而前两种是在创建的子进程中执行

bash运算

bash算术运算:

       命令:let、$[ ]、$(( ))、$(expr )、declare –i、echo “…“|bc

       运算符:+、-、*、/、%、**、增强型赋值(++、--、+=、-+、*=、/=、%=)

       [eg]将3*4运算结果赋值给var

              letvar=3*4;var=$[3*4];var=$((3*4));var=$(expr 3*4);

              declare –i var=3*4;var=`echo “3*4”|bc`

bash逻辑运算:

       逻辑值:true(1)、false(0)

       与或非:

              与:和1相与的保留原值、和0相与的全部为0,进行二进制转换

              或:和1相与的全部为1、和0相或的保留原值,进行二进制转换

              非:取相反逻辑值,不进行二进制转换

       短路:

              短路与:前者为0时不考虑后者

              短路或:前者为1时不考虑后者

              cmd1&&cmd2:cmd1为真时执行cmd2,为假时不执行cmd2

              cmd1||cmd2:cmd1为真时不执行cmd2,为假时执行cmd2

       异或:

              ^:异或的两个值相同为0,不同为1(同性相斥)

bash测试

条件测试:

       测试机制:判断某需求是否满足,为真返回0,为假返回1

       测试命令:test、[ expression ]、[[expression ]]

条件性执行操作符:

       &&:代表条件性的and then,等同于-a

       ||:代表条件性的or else,等同与-o

bash数值测试:

       -vvar(变量var是否设置)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)、

       -eq(等于)、-ne(不等于)

bash字符串测试:

       =、>、<、!=、=~(左侧字符串是否能被右侧pattern匹配,一般用于[[ ]]中)

       *用于字符串比较时用到的操作数都应该使用引号,比较符号前后注意加空格

       [eg]str=abcde;[[ “$str” =~ abc?? ]]&&echo true||echo false

bash文件测试:

       存在性测试:-a(文件存在)、-e(同-a)、-b(存在且为块设备)、-c(存在且为字符设备)、

                            -f(存在且为普通文件)、-d(存在且为目录文件)、-h(存在且为链接文件)、

                            -p(存在且为命名管道文件)、-s(存在且为套接字文件)

       权限测试:-r(存在且可读)、-w(存在且可写)、-x(存在且可执行) 、-u(存在且有suid)、

                        -g(存在且有sgid)、-k(存在且有sticky)

属性测试:-s(存在且非空)、-f(文件描述符是否在某终端打开)、-O(当前用户是否属主)、

                  -G(当前用户是否属组)、-N(自上次读取后是否被修改过)

bash命令行展开

            命令行分成单个命令词->展开别名->展开大括号声明{ }->展开波浪符声明~->命令替换$( ) ->再次将命令行分成单个命令词->展开文件通配符->准备I/O重导向->运行命令

相关练习

1.编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到 /root/etcYYYY-mm-dd中

backup.sh
执行结果

2.编写脚本/root/bin/nologin.sh和login.sh,实现禁止和允许普通用户登录系统


脚本代码
nologin.sh执行结果
login.sh执行结果

3.编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

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

推荐阅读更多精彩内容