SHELL编程笔记

                                       首先介绍一下SHELL是面向过程的语言,过程是什么呢?

       接下来我就来说说过程是什么,如果说你要做某一件事情,先要排出一个步骤,第一步干什么,第二部干什么,第三步干什么......

这时候我们就要判断,如果出现情况A,我们需要做出什么处理,如果情况B,做出什么处理,当然做出处理的时候还要做好分析,问题解决完了,分析是那个环节出了问题,保证下次不在出现同样的错误(当然也会有判断出错的时候)。

     如果问题规模小,就可以步骤化,按部就班处理

     以指令为中心,数据服务于指令

编程三种处理逻辑

  1.顺序执行:程序按从上到下顺序执行

  2.选择执行:程序执行中,根据条件的不同,进行选择不同分支继续执行

  3.循环执行:程序执行执行过程中需要重复执行多次某段语句或命令

 SHELLscript的用途

  1.将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率

  2.减少手工命令的重复输入,程度上也避免了人为错误

  3.将软件或应用的安装及配置实现标准化

  4,用于实现日常性的,重复性的运维工作,如:文件打包压缩,监控系统运行状态并实现警告等

 SHELLscript基本结构

  shell是基于过程式,解释执行的语言

  1.各种命令的组合

  2.数据存储,变量,数组

  3.表达式: a+b

  4.控制语句:if

 SHELL执行过程

  1.添加注释

  2.加执行权限,在命令上指定script的绝对或相对路径

  3.调试,运行script

  

  SHELLscript调试

       只检测script中的语法错误,但无法检查命令错误,但不真正执行script : bash    -n     <script名>

    调试执行script     bash -x   <script名>

              总结:常见错误分为:1.语法错误  2. 命令错误  3.逻辑错误

    

变量:

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

    变量类型

             $PS    $PATH   $UID  $HOSTNAME  $$   $BASHPID   $PPID   $?  $HISTSIZE

 用户自定义变量:不同的变量存在的数据不同,决定了以下:1,数据存储方式 

                               2,参与的运算

                               3,表示的数据范围

   变量数据类型:字符,数值,整型,浮点数(小数),bash不支持浮点数

静态语言和动态语言

   静态编译语言,使用变量前,先声明变量类型,之后类型不能改变,在编译时检查

   动态编译语言:不用事先声明,可随时改变类型

SHELL中变量命名法则

 1.区分大小写,不能使用程序中的保留字和内置变量,如:if    for

 2.只能使用数字,字母下划线,且不能以数字开头,“注意:不支持短横线  "-",和主机名相反

    通常情况下:建议大家命名变量的时候用英文单词作为命名,并体现实际作用,不要使用简写,这样看着 就见名知义

    变量名大写,局部变量小写,函数名小写

普通变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前的shell的子shell进程均无效

环境变量:生效范围为当前shell进程及子shell进程

本地变量:生效范围为当前shell进程中某代码片段,通常指函数

  1.变量可以被追加内容

  2.间接赋值和引用

 

环境变量   (export)

删除变量     unset   name

 

只读变量: (readonly)

声明定义,只能读不能改

 

位置变量:在script代码中调用通过命令行传送给script的参数

  $1,$2,.......对应第一个参数,对应第二个参数,........

  $0  表示命令本身,包括路径

  $*   表示所有参数为一个整体

  $@   表示所有参数为一个单词的字符串或者数值,

  $#   表示传递给script参数的个数

这时候我们要注意一点:$@,$*通常情况下都是一样,只有在被双引号引起来的情况下才会有不一样的作用

      set -- 清楚所有位置变量

 

变量扩展:`   ` :反引号,命令替换,可以实现动态命令

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

      !:叹号,历史命令替换

 

script安全:set  命令  可以用来定制shell环境

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

     -e 如果一个命令范围一个非0,退出状态值(失败)就退出,等于set -o errexit

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

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

 

格式化输出:printf

            格式:printf     “指定的格式 ”   “ 文本1”   “文本2”   ........可以加多个文本

常用格式替换符:%s    字符串

        %d,%i 十进制整数

        %f   浮点格式

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

        %b  相对应的参数包含转义符,可以使用次替换符进行替换,对应的转义字符会被转义

        %o    八进制值

        %u 不带正负号的十进制数值

        %x 十六进制数值(a-f)

        %X 十六进制数值 (A-F)

        %%  表示%本身

说明:%#s  中的数字代表此替换符中的输出字符宽度,不足补空格,默认时右对齐,%-10s表示10个字符宽度,-   表示左对齐

          %03d  表示3为宽度,不足前面用0补全,超出位数鸳鸯输出

          %.2f    中的2表示小数点后显示的小数位数

   常用转义字符:\a  警告字符,通常为ASCLL的BEL字符   (输出ASCLL为07的时候,会发出一声“滴”的声音)

          \b 后退

          \f 换页

          \n 换行

          \r 回车

          \t 水平制表符

          \v   垂直制表符

          \    表示本身

 

算术运算:(1)let  var=算术表达式

     (2)((var=算术表达式)) 和上面等价

     (3)var=$[算术表达式]

     (4)var=$(expr  arg1 arg2 arg3  ........)

       (5)  echo '算术表达式‘ |  bc

增强型赋值

++i   先加完在赋值

i++   先赋值再加

i--    先赋值在减

--i 先减在赋值

 

逻辑运算:true  false

二进制数: 1       0     “ 注意:这里的0和($?)不一样,这里的0是一个十进制0”

& 与  运算  :和0的结果为0,和1相与结果保留原值,一假全假,全真才真

|    或  运算:和1相与的结果都为1,和0相或结果保留原值,一真则真,全假才false

! 非  :假的是真的 ,真的是假的

^ 异或  : 异或的两个值,相同为假,不同为真,两个数字X,Y异或得到结果Z,Z在和任意两者之一X异或,将得出另一个值Y

 格式:x=1;y=2;x=$[x^y];y=$[x^y];x=$[x^y]; echo $x $y 

短路运算

&&       CMD1 && CMD2

         如果第一个CMD1结果为真,那么CMD2也要参与运算,才能得出最终的结果

        如果CMD1结果为假,那么CMD2也就不需要参与运算

短路或

||      CMD1 || CMD2

   如果CMD1运行成功,那么CMD2就不需要参与运算

   如果CMD1没有运算成功,那么CMD2必须要参与运算,才能得出最终的结果

 

条件测试命令

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

      测试过程,实现评估布尔声明,以使用条件性环境进行执行

      若真,则状态码变量 $? 返回0

      若家,则状态码变量 $? 返回1

      test    EXPRESSION

   [ EXPRESSION ] 和test等价

   [[ EXPRESSION ]] 增强版的[    ] 且支持扩展正则表达式

*注意 EXPRESSION 前后都要有空格

  -a   表示两个条件都确认

  -b   如果file为一个特殊块file,则为true

  -c   file为一个字符特殊file,则为true

  -d   file作为一个目录,则为true

  -e   file存在,为true

  -f    file为一个普通file,     为true

  -g   file设置了set-group-id   为true

  -G   file存在且归该组所有,为true

  -k 设置了file的sticky位, 为true

  -O  属于自己,为true

  -p   file输入管道file ,为true

  -r   file可读,为true

  -x   file可执行 ,为true 

  -w  file可写,为true

  -S  file位套接字file,为true

  -L  file为符号链接file,为true

  -u   file设置了set-user-id 为true

  -N  如果上次的读的file未被修改过,为true

  -nt  如果file1比file2更新,为true

  -ot  file1比file2 老 为true

  -ef  file1是file2的的硬链接 为true

  -z  如果string为空  为true

  -n 如果string 不为空,为true

  -o  启用shell选项   ” 同时使用多个条件可以选用“

  -v 如果设置了shell变量为true

  -s file是否存在且非空

       string1  =  string2 相等为true   (比较的时候等号两边都要有”space“)

      string1  != string2 不相等true  (比较的时候等号两边都要有”space“)

数值测试: [        ]  

           -eq     相等

   -ne    不相等

   -gt     大于

   -ge   大于等于

   -le    小于等于

   -lt    小于

测试命令: [[      ]] 

                  ==    右侧为通配符

     =~   右侧为正则表达式   ( 如果匹配正则表达式,匹配到其中一个都算成功)

     !=    表示不等于

-a  表示并且  (当前如果有多个条件都满足,这时候使用-a 选项,)

-o  表示或者   (当前如果有多个条件,有些条件没有满足,这时候就用-o )

小括号和花括号(){   } 

()里面的指令在shell环境中运行,变量赋值和内置变量将影响shell环境  (命令和变量只在括号里面才有效)

     运用的时候注意 ”开头有空格,结尾也要有空格“

  {  }  切换环境 :改的只是当前环境,不开启子shell,改了外界环境,

  使用花括号的时候注意 “前后有空格,结尾有分号”

组合测试条件

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

 

read  命令 涵义:从标准输入中读取一行并将其分割为多个字段,(当然可以使用-p选项来定义输入的string为变量)

           -p    指定要显示的内容

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

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

   -d   “字符”输入结束符

   -t  NTIMEOUT 为N秒

(read)命令可以同时创建多个变量 写法: read NAME TITLE

         --------->输入的值:  wang cto 

第一个对应的就是$NAME的变量,第二个,也就是对应的第二个变量。

 read 命令也可以使用重定向 将重定向的内容引入read 内容中

 

BASH SHELL 的配置文件

  按生效范围划分为两类

   全局配置下,针对所有用户皆有效

    /etc/profile

    /etc/porfile.d/*.sh

    /etc/bashrc

  个人配置,只针对特定用户有效

        ~/.bash_procfile

    ~/.bashrc

 假如不是完全切换,只是挑了一些文件执行,会执行/etc/progile.d/*.sh,  .bashrc(rc ---run   command 运行)

 

如果是完全切换,先执行/etc/profile.d/*.sh

           /etc/profile

           .bashrc

           .bash_profile

将来可以把一些脚本放在/etc/profile.d/ 下面,这样开机就会自启动

/etc/profile.d/*.sh    .bashrc      /etc/profile    .bash_profile  都属于登录式配置文件

SHELL登陆两种登陆方式

    交互式登录:1.直接通过终端输入账号和密码

          2.使用su - username 切换的用户

    非交互式登录

          1.su username 

          2.图形界面下打开的终端

          3.执行script

          任何其他的bash实列

按功能划分分类

  procfile类和bashrc类

  procfile类为交互式登录的shell提供配置

  功能:1.用于定义环境变量

     2.运行script命令

  bashrc类:为非交互式和交互式登录的shell提供配置

  功能:1.定义命令别名

     2.定义本地变量

编辑配置文件生效

   修改procfile和bashrc文件后需生效两种方法:1.重启shell进程     2.source  或者 (.)  配置文件 (注意竖线为分隔符,我这里是怕大家看不清楚)

   注意:suorce会在当前shell中执行script,所有一般只用于执行配置文件,或在script中调用另一个script的场景

    .    ~/bashrc

BASH 退出任务

    保存在~/.bash_logout文件中(用户),在退出登录shell时运行

     功能:1.创建自动备份     2. 清楚临时文件                            

.bash_logout 当用户要退出的时候也可以触发一个配置文件执行 

if cmd ; then ;fi

elif cmd ; then ;

else  cmd   ;then

fi

 

            

for 循环

for NAME in  word ; do  cmd  ; done 

条件的个数决定了我们要循环多少次

  

for ((exp1;exp2;exp3)); do cmd ;done

while

while cmd;do cmds ; done

无限循环:trun ;(:)

continue 提前跳过本轮循环(跳过最内层的第一层循环)

continue 2  提前跳过(跳过最外层的第一层的一轮循环)

break   结束本轮循环(结束最内层的第一层)

break 2  结束最外层的一轮循环(结束最外层的第一层的一轮循环)

shift   表示跳过位置  比如user1创建完成之后user2顶替user1 这时候user2就变成user1

shift 2 一次性跳两个

while read   实现文本卓行处理

PS3   影响select 菜单

PS1   影响主机名颜色

PS2= 影响多行重定向 <<EOF

 

 shift循环控制命令

  shift【n】用于将参数量列表list左移指定次数,缺省为左移一次

  参量列表list一旦被移动,最左端的那个参数就从列表中删除,while循环遍历位置参量列表时,常用到shift

 

 

 

   

 

posted @   家购诗  阅读(10)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示