Shell基础

shell基础

bash变量

读作:beish

shell与其他语言对比

Shell脚本语言,比较简单,所见即所得,在运行时就编译。坏处在于,在执行过程中编译,因此速度比C、Java这些事先编译好的稍微慢一点。可以用于批量增加新用户,定时更新等简单操作,但是不适用于复杂操作。

1、PHP和java主要实现功能;

2、Shell简化管理操作。

什么是变量?变量的分类?

变量

变量命名规则:

Shell基础_第1张图片

变量按照存储数据分类

字符串型,整型,浮点型,日期型

分类

用户自定义变量

简介

变量不能数字开头,等号两端不能有空格,变量中存在空格时需要双引号或单引号括起来(双引号与单引号区别:双引号括起来的字符中如果有特殊字符会起作用,单引号中丧失作用)。

变量定义

变量调用

Shell基础_第2张图片

注:echo是输出指令,还有其余的很多指令可以实现这种功能。只要调用变量都需要在其前面加$(定义时不加$,这与PHP不一样)。

变量叠加

有时我们需要修改某一些变量,但是不是改变内容,这时可以用叠加。

操作:

Shell基础_第3张图片

 

变量查看

Set会查询当前shell中运行的所有变量,与前面的调用不一样。可以列出系统默认存在的环境变量。

 

注:查看一个不存在的变量会显示空,这会有歧义,因为如果一个变量赋值为空,输出也是这样子。所以用set -u指令可以区分。

变量删除

注:这里不需要加$,删除变量并不是删除变量值。

Bash环境变量

简介

Shell基础_第4张图片

 

 

Shell基础_第5张图片

注:在shell中输入bash可以进入子shell,输入exit退出子shell,输入pstree查看。

 

设置环境变量

查看环境变量

注:env只用来查看环境变量。

删除环境变量

父shell定义的变量虽然在子shell中可以查看,但是不能在子shell中删除,必须回到父shell中才可以。

常用环境变量

PATH环境变量

Shell基础_第6张图片

注:系统命令比如ls可以不需要输入路径就执行,这就是因为在PATH中有定义的命令路径。

操作:

 

注:第一个是相对路径执行,第二个是绝对路径。

Vi中内容:

如果我们想设置为环境变量,不需要这么繁琐的输入路径,直接识别指令,有两种方法:

  1. hello.sh复制到PATH的某一路径下,比如bin目录下

注:这样容易混乱,不建议使用。

  1. 利用变量叠加,在PATH之后叠加路径

注:这样只是临时生效,一旦重启就消失。如果想要永久起作用,就需要将其写入对应的文件之中。

PS1环境变量

定义当前操作系统的起始符。

 

注:\u——当前用户,@——没有作用,\h——简写主机名,空格——无意义,\w——当前所在路径的最后一个目录,\$——提示符。

操作:

注:这里#与PS1之间有空格,且后面有单引号,$与’之间有空格。改完之后前面的显示就改变了。

PS2环境变量

注:如果有的指令太长,一行输入不下,需要换行,可以使用指令+\的形式,之后会出现>,这个符号就是PS2定义的。

bash语系变量

当前语系查询

Shell基础_第7张图片

注:当前生效的是LANG,实际上此时LC_ALL是空的。

Shell基础_第8张图片

查看系统默认语系

注:这个是系统开机之后默认进入的语系,而LANG是当前的语系,如果当前是中文,默认语系修改成英文,则重启后会显示英文。

Linux中文支持

Shell基础_第9张图片

注:远程工具可以显示中文,而纯正的linux字符界面是英文的。

位置参数变量

举例:

$n

Shell基础_第10张图片

分析:

脚本中内容:

注:这里num=$1,不能是$s1。

结果:

注:$n是向程序传递参数,这样比直接用常量方便,但是我们必须事先了解它的使用规则(这里必须在后面加上两个参数才可以运行这个脚本),因此不适用第三方用户,只适合编写者自己使用。

易错点:

这里错误原因在于sum1与后面等号之间多空格,不能留有空格。

$*$@$#

Shell基础_第11张图片

脚本内容:

Shell基础_第12张图片

运行结果:

 

$*$@区别:

Shell基础_第13张图片

注:$*把里面的数字看做一个值,只会循环一次。$@把输入的参数看做独立的,循环多次。这里一定要注意双引号。

注:这里介绍一下linux中的for循环,其格式为:

注:in之后跟几个数for循环几次,,每次循环把in后面的值赋值给变量i。

输出结果:

Shell基础_第14张图片

脚本内容:

输出结果:

Shell基础_第15张图片

预定义变量

Shell基础_第16张图片

注:命令执行错误返回的数值不是用户决定的,有写具体指令的人确定返回的非零值。

注:实际上逻辑与、或操作中,后面一条指令是否执行就是通过判断第一条指令返回值确定的。

$$

$!

比如find指令前台运行不合适,可能会卡在shell上,需要后台运行。后台运行符号为&。

结果:

预定义变量名称和作用都不可以更改。

接受键盘输入

注:位置参数变量只适用于作者使用,其余用户不知道怎么输入,因此这里用到read指令。

举例:

结果:

其余参数:

Shell基础_第17张图片

注:密码不能显示出来,需要使用-s,规定输入时间-p。需要添加换行符前面需要echo -e。

结果:

Shell基础_第18张图片

注:我这里输入的密码实际上是给一个变量了,留作其他的输入。

指定接受

 

shell编程环境变量配置文件

环境变量配置文件简介

变量类型

Shell基础_第19张图片

注:环境变量必须写到相应的文件中,否则重启后消失。

Source命令

Shell基础_第20张图片

注:在.与配置文件之间有一个空格。

注:在.后面加一个空格,这里的.就表示source命令了,而不是隐藏文件(.bashrc这里是隐藏文件,./表示当前路径)。

环境变量配置文件介绍

 

举例:

注:其实环境变量也不一定都是开机后生效,也有关机后生效的。第3、4个是在家目录下,而每个用户都有不同的家目录,因此这是每个用户自己独有的。而第1、2、5放在etc下,所有的用户都会用到,对所有用户有效。

 

环境变量配置文件功能

作用的先后顺序

Shell基础_第21张图片

注:正常登录过程(不是正常启动过程,需要输入用户名和密码),加载顺序是上面的顺序,里面的环境变量都会起作用。不完整的登录过程(比如超级用户切换到普通用户,不需要输入用户名和密码),如下所示:

Shell基础_第22张图片

注:这里加载完左侧的红线部分以后,再加载右侧的命令行。

/etc/profile

查看:vi /etc/profile,这时login时使用的,也就是需要输入用户名和密码。定义PATH,判断是不是超级用户(这直接决定登陆后的所处的文件路径):

 

Shell基础_第23张图片

注:在命令行中直接输入umask,输出一串数字:

注:第一0,定义系统特殊权限,后面3个是如果新建一个文件,其默认权限由这3个定义。

umask原理:

  1. 执行权限是文件的最高权限,这里不允许新创建的文件就具有可执行权限,这样不安全,只能创建读写(即6)的文件。

  2. 目录最高权限可以是777(目录的最高权限就是进入目录)。

  3. 权限不能使用数字换算,必须是字母:也就是将系统规定设置的最高权限减去umask的权限,重叠的权限删除(这就相当于相减的操作)。文件权限设置如下:

注:这里前一个是666,第二个是022(umask值),相减结果为644(即设定的文件权限,我们可以在profile中更改umask值,这样新创建的文件权限也就跟着改变了)。

对于目录:

语系

注:我们只需要了解profile.d中的lang即可。

Shell基础_第24张图片

 

Shell基础_第25张图片

注:如果需要修改历史命令条数,修改/etc/profile,别名在~/bashrc,登录起始符在/etc/bashrc。

常见错误:登录后起始符错误

注:/etc/bashrc是在最后调用的,如果前面的某一文件消失则不会加载bashrc,这样就会显示系统自带的提示符。

 

其他环境变量配置文件

注销时生效的环境变量配置文件

注:在此时时空的,也就是退出后不执行任何操作,当然我们可以定义为清空历史命令:

 

注:一般不建议清楚历史,登陆后输入history可以查看历史命令。

 

注:默认情况下历史条数为1000条,能否改动大小取决于命令的存储位置,如果在内存中不建议修改太大,如果在硬盘中则可以修改。我当前命令产生的历史会记录在内存中并不会立即存储在.bash_history中。

Shell登录信息

Shell基础_第26张图片

 

注:只对本地终端起作用,远程终端不起作用(也就是说这个文件对远程登录是无效的)。

修改后:

输出:

注:这里在配置文件中添加\l之后会显示终端(这里为终端1),按住Alt+F2可以切换到另一个终端2,按Alt+F1切换回来。

但是这只是本地起作用,远程不起作用,可以用以下操作:

Shell基础_第27张图片

注:远程登录欢迎信息是由SSH决定的,而不是这个配置文件。具体配置如上所示:

寻找banner:

重启服务:

这样还是过于麻烦,因为本地和远程登录不同的设置比较麻烦,可以这样解决:

 

注:这里随便输入测试即可。

shell编程

shell变量的特点?

——弱类型

——默认字符串型(字符串型是不能直接进行加减乘除数值运算,因此需要进行数值运算时,需要将shell变量声明为数值型,不要使用默认值)

declare命令

——用来声明变量类型

格式:

 

注:在这里要格外注意,我们需要添加一个声明时用“-”,而不是“+”。

举例:

把变量声明为数值型

Shell基础_第28张图片

注:这里我们可以明确看出,在默认情况下变量为字符型,因此c默认输出为11+22,如果想想要输出加法运算的结果,则需要将c声明为int类型(a、b不需要声明为int,因为声明c后,在进行a+b运算时会自动将后面进行转化)。

可以查看变量属性:

声明数组变量

操作:

注:在查看数组的时候,$后面需要添加{},在不加下标,直接以数组名给出时默认显示第一个数组元素,加上*时,显示全部。

声明环境变量

注:环境变量的声明实际上也是declare命令。-X表示声明为环境变量。如果这样操作:

Export aa,即表示把aa声明为环境变量,则在执行bash-->set这两个指令时只能看到aa,不能看见bb。Bb只会出现在当前目录。

声明变量只读属性

操作:

Shell基础_第29张图片

注:这里不能修改和删除。甚至我们执行撤销属性都不可以。在实际应用中要格外注意,如果将制度属性的变量加到某一系统环境变量中在开机时会自启动,这样会出错。我们这里设置的是临时环境变量,系统重启后消失。因此,只读属性并不是很好用,实际中尽量少用。

查看变量属性

数值运算方式

数值运算方法1

注:这种方法需要敲很多指令,麻烦。

方法2exprlet数值运算工具

操作:

Shell基础_第30张图片

注:在没有空格的时候不会进行直接加的运算,而是当做字符串运算。

 

方法3:”$((运算符))”或”[运算符]

Shell基础_第31张图片

注:推荐这种写法”$((运算符))”

区分以下的方式:$(运算符)——它的作用是把系统命令先执行,再把命令的结果赋予变量。

 

 

运算符

Shell基础_第32张图片

注:优先级越高数值越大。实际中用到的数值运算并不多。

变量测试

简介

只针对shell语言有效,比较复杂。在实际中可以用其他方式取代,格式复杂,语法简单,了解即可。

Shell基础_第33张图片

注:在优化时用到,比如php写的网页脚本,访问量很大,就需要优化。在实际中shell一般是管理员用(因为我们的目的就是办公自动化),所以要求逻辑要清晰,而这种方式并不是很适用。

例子1:测试x=${y-新值}

Shell基础_第34张图片

 

Shell基础_第35张图片

 


你可能感兴趣的:(Shell基础)