当前位置: 首页 > Linux

外壳基础

时间:2023-04-06 02:14:40 Linux

1.输出命令echo[选项][输出内容]选项:?-e:支持反斜杠控制的字符转换(详见表1)?-n:取消输出行末尾的换行符(内容后无换行符)output)2.shell脚本的结构(一般三部分)(1)在脚本中声明语言:#!/bin/bash(2)声明脚本的功能。#开头的语句都是注释(3)脚本主体3.运行方式(运行前请注意文件是否有执行权限)(1)直接使用路径运行(2)调用脚本bash文件paththroughbash4.设置命令别名(1)在系统中显示命令别名别名(2)设置别名aliasalias='originalcommand'注意:设置别名后,原命令将失效。并且系统中不能存在设置的别名。该命令设置的别名在系统未注销或未重启前一直有效。需要持久化,需要修改配置文件。(3)删除别名unalias原命令5.提取命令grep提取并匹配文件中所有满足条件的字符串行grep[options]"Searchfor"filenameoptions:?-Anumber:列出匹配的行条件,并列出接下来的n行;?-Bnumber:列出满足条件的行,并列出前n行;?-c:统计找到的满足条件的字符串个数;?-i:忽略大小写;?-n:输出行号;?-v:反向查找;?--color=auto:搜索出的关键字以彩色显示;6.管道字符用于连接多个命令,但是下一条命令的执行取决于上一条命令的正确输出"command1|command2"命令2只能处理命令1的正确输出ls-a/等/|更多7.Bashwildcard通配符功能?匹配任意字符*匹配0个或任意数量的任意字符,即匹配任意[]匹配方括号中的任意字符。例如[abc]表示必须匹配一个字符,或者a,orb,orc[-]匹配方括号中的任意一个字符,-代表一个范围。例如,[a-z]表示匹配小写字母[^]逻辑NOT表示匹配不在方括号内的字符。例如,[^0-9]表示匹配一个不是数字的字符。8.单引号、双引号和反引号。单引号中的内容将作为字符串输出。双引号中的内容会考虑特殊含义,比如"$","\"如果需要调用命令的输出或者将命令的输出赋值给变量,就需要反引号,相当于$(command),但为了避免反引号和单引号混淆,用$(command)代替反引号9.圆括号和花括号圆括号和花括号的主要区别是:?()在执行一系列命令时,需要重新打开一个子shell来执行它们。?{}当执行一系列命令时,在当前shell中执行。?()和{}都是在字段括号中放置一串命令,命令之间用“;”分隔。?()最后一个命令可以不带分号使用。?{}最后一个命令使用分号。?{}的第一个命令和左括号之间必须有一个空格。?()内的每个命令都不需要在括号中有空格。?在()和{}括号内的命令重定向只影响该命令,而在括号外的重定向将影响括号内的所有命令。实际上,在执行一系列命令时,如果使用括号,则这一系列命令所做的修改只会在子shell中生效。一旦命令执行结束返回父shell,修改将丢失;大括号,那么这串命令会直接在父shell中执行,命令执行后修改仍然生效。父壳和子壳互不干扰。10.变量(1)变量由字母、数字和下划线组成,不能以数字开头。(2)在Bash中,默认的变量类型是字符串类型。要进行数值运算,必须另作规范:如:a=1+2echo$a1+2(3)变量两边用“=”连接,两边不能有空格等号(4)变量叠加:两种格式:“$变量名”或${变量名}(5)将命令的结果赋给变量作为变量的值,需要使用$()(反引号不推荐)(6)环境变量建议使用大写11.用户自定义变量(1)查询已设置变量set[option]option:?-u:如果设置了该选项,报错调用未声明的变量时会报错(默认无提示);?-x:如果设置了这个选项,命令执行前会输出一次命令;(2)删除变量Unset变量名12.环境变量和自定义变量环境变量是全局变量,而自定义变量是局部变量。如果将环境变量写入配置文件,则环境变量可以永久存在,否则,一旦shell终止,环境变量也将失效变量Env只查询环境变量(3)删除Unset变量名13.bash位置参数变量用法lsa.confb.confc.conf//那么$0的值就是ls命令本身,$1、$2、$3的值分别是a.confb.confc.conf位置参数变量作用$nn是一个数字,$0代表命令本身,$1~$9代表第1到第9个参数,10以上的参数需要用大括号括起来,比如${10}$*这个变量代表命令行中的所有参数,并将所有参数作为一个整体来对待ofparameters14.Predefinedvariables(已经定义,不能改变的全局变量)predefinedvariables的作用是$?最后执行的命令的返回状态。如果这个变量的值为0,证明前面的命令执行正确;如果这个变量的值不为零(具体数字由命令自己决定),则证明之前的命令执行错误$$当前进程的进程号(PID)$!后台运行的最后一个进程的进程号(PID)15.接收标准输入Read[选项][变量名]选项:-p"提示信息":等待读取输入时输出提示信息;?-tseconds:读命令会一直等待用户输入,使用这个选项指定等待时间;?-n字符数:读取命令只有在接收到指定的字符数后才会执行;?-s:隐藏输入数据,适用于机密信息的输入;read-n1-t30-p"Pleaseselectyourgender[M/F]:"gender提示“Pleaseselectyourgender”并等待30秒,将用户输入保存到变量gender中以供使用“-n1”option只执行一个输入字符(不需要按回车键)16.数值运算(1)用declare声明变量类型declare[+/-][option]变量名option:?-:给变量设置类型属性;?+:取消变量的类型属性;?-a:将变量声明为数组类型;?-i:声明变量为整型(integer);?-r:将变量声明为只读变量。注意,一旦设置为只读变量,就不能修改变量的值,也不能删除变量,更不能用+r取消只读属性;?-x:将变量声明为环境变量;?-p:显示指定变量的值声明的类型;Name[0]="张三"Name[1]="李明"Name[2]="小明"echo${name}//张三郎${name[*]}//张三李明晓ming(2)使用expr或let数值计算工具dd=$(expr$aa+$bb)注意+号两边必须有空格,否则不会执行运算letee=$aa+$bb(推荐运算法)(3)$((运算表达式))or$[运算表达式]Gg=$[$aa+$bb]17.常用运算符优先级运算符说明-,+单目负,单目正!,~逻辑NOT、按位取反或补码*、/、%乘法、除法、取模+、-加法、减法<<、>>按位左移、按位右移<=、>=、<、>小于或等于、大于或等于、小于、大于==,!=等于、不等于&按位与^按位异或|按位或&&逻辑与II逻辑或=,+=,?=,*=,/=,%=,&=,|=,<<=,>>=赋值,运算与赋值18.错误处理#1。启用变量时没有错误信息,默认变量不存在会忽略set-u#2.如果有错误,退出set-e#3.如果管道运行有错误,它后面还会继续执行,所以set-e需要其他命令配合set-eopipefail#4.查看每条命令的执行结果,用于调试set-x#5.总结之前,建议把命令加在开头每个脚本:set-euopipefail#6.exithookfunctionfinish{err=$?如果[[$err==1]];thenecho'1'fi}trapfinishEXIT中的trap是内置命令,用于捕获发送给程序的信号。它接受两个参数,第一个是处理信号的方式,第二个是信号名称。#7.代码调试如果只想调试代码而不执行代码,可以使用sh-n*.sh另外,我们还可以通过set-x命令增强效果。上面说了,执行的命令前面会有一个+前缀。它实际上是通过一个名为PS4的环境变量来控制的。我们可以修改这个变量:exportPS4='+{$LINENO:${FUNCNAME[0]}}'这样会显示代码的行号(LINENO)和当前函数名(FUNCNAME[0])