一、shell概述
编译型语言(java),通过编译器将程序的高级语言翻译成机器语言,一次编译多次运行,运行时不需要重新翻译直接使用编译的结果,程序执行效率高,依赖编译器,跨平台性差。
解释型语言(shell),通过解释器将程序的高级语言翻译成机器语言,每执行一次都要翻译一次、程序执行效率低。
shell解释器,用户在终端程序输入命令,shell 将命令翻译给Linux内核,内核再去调用系统硬件。shell解释器将命令解析成计算机语言,告诉内核来调用物理硬件。
打开终端程序默认有个bash,bash就是shell的一种类型(bash shell),在终端上敲任何命令,会有bash去解析命令,解析命令的是bash不是终端,终端只是个程序。
查看shell种类,
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
在终端输入不同的bash(如
Shell脚本文件的名称按功能来见名思义,为了避免被误以为是普通文件,最好shell脚本名是以.sh结尾
使用标准脚本执行方法前提是脚本要有可执行权限x,
标准脚本执行方法是使用脚本的绝对路径或相对路径,使用相对路径直接在脚本所在目录输入脚本名不行,要加个./指明当前路径下./shell01.sh
脚本没有可执行权限x可用非标准执行方法(直接用shell解释器解析脚本),
非标准执行方法还有这两种执行方式,source和点.
source 和 . 表示读取文件,执行文件里的命令,
在写配置文件让其立即生效时用到
-x:一般用于排错,查看脚本的执行过程
-n:用来查看脚本的语法是否有问题
*: 匹配0或多个任意字符
?: 匹配任意单个字符
[]: 匹配[]中的任意单个字符[abcd]或[a,b,c,d],或者一组单个字符[a-d]
[!]: 匹配除[]中的任意单个字符
{string1,string2,...}:匹配string1,string2或更多字符串,多个字符串之间用逗号隔开,一组字符串用两个点隔开file{1..5}
1、双引号"",会把引号的内容当成整体来看待,允许通过$符号引用其他变量值
2、单引号'',会把引号的内容当成整体来看待,禁止引用其他变量值
3、反撇号``:类似双引号中允许$变量调用的作用,
如果存在嵌套,反撇号不能用(反撇号嵌套会报错,多个撇号会区分不了起始结束撇号````)
`date +%F`"
$()和反撇号``里面的命令先执行,再echo输出
本地变量(临时变量),
当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
临时将一个本地变量变成环境变量
export PATH将PATH本地临时变量变为环境变量(临时生效)
永久生效:/etc下面的配置文件是全局的
/etc/profile 系统和每个用户的环境变量
/etc/bashrc 使用bash shell用户的bash信息(aliase别名、umask掩码、函数等)
vim /etc/profile
export A=hello
export PATH=$PATH:要添加的命令的路径
~/当前用户的(局部变量),在每个用户家目录下有以点开头的配置文件
~/.bash_profile,当前用户的环境变量
~/.bashrc,当前用户的bash信息(aliase别名、umask掩码、函数等)
~/.bash_logout,每个用户退出当前shell时最后读取的文件
用户登录系统读取相关文件的顺序:
/etc/profile——>~/.bash_profile——>~/.bashrc——>/etc/bashrc——>~/.bash_logout
系统变量(内置bash中变量)
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常
$$:当前所在进程的进程号 `echo $$` 等同于exit命令,退出当前会话
$!:后台运行的最后一个进程号
!$ 调用最后一条命令历史中的参数
!! 调用最后一条命令历史
$#:脚本后面接的参数(变量)的个数
$*:表示将变量看成一个整体,整体在一行输出所有参数变量,所有参数变量空格隔开在一行展示
$@:表示变量是独立的,换行输出每个参数变量
./1.sh a b c 执行1.sh脚本传abc三个参数
./1.sh 执行1.sh脚本不传参数
$0:当前执行的进程/程序名,
$1~$9 位置参数变量,即第几个参数
${10}~${n} 扩展位置参数变量,第10个位置变量及后面的变量必须用{}大括号括起来
自定义变量
1. 默认情况下,shell里定义的变量是不分类型的,可以给变量赋予任何类型的值;
等号两边不能有空格,变量名=变量值,A=hello
对于有空格的字符串做为赋值时,要用引号引起来,A="hello world"
2. 变量的获取方式:$变量名 或${变量名}
如果获取变量的全部两个都可以;如果获取变量的某一部分,用${}
A表示变量名;2表示从第3个字符开始(0代表第一个字符);3表示截取字符长度
3. 取消变量:
4. 变量名区分大小写,同名称但大小写不同的变量名是不同的变量
5. 变量名可以是字母或数字或下划线,但是不能以数字或者特殊符号开头
6. 命令的执行结果可以保存到变量
`date +%F` 或
7. 有类型变量 declare
-i 将变量看成整数(整型)
-r 使变量只读readonly
不能再次给此变量赋值进行覆盖,也不能用unset取消变量
可退出终端让其失效,因为它是临时本地变量
-x 标记变量为环境变量(export 变量名)
-a 指定为普通数组;也能查看普通数组
-A 指定为关联数组;也能查看关联数组
10+20
6
8. 数组
普通数组:只能使用整数作为数组索引(元素下标)
关联数组:可以使用字符串作为数组索引(元素下标)
普通数组定义:用括号[]来表示数组,数组元素(变量)用“空格”符号分割开。
一次赋一个值:变量名=变量值
array[0]=v1
array[1]=v2
array[2]=v3
一次赋多个值:array=(var1 var2 var3 var4)
将文件中每一行赋值给array1数组
array1=(`cat /etc/passwd`)
array2=($(ls /root))
array3=(1 2 harry "Miss Hou" [7]=tom)
读取数组:${array[i]} i表示元素的下标
使用@或*可以获取数组中的所有元素:
echo ${array[0]}获取第一个元素
echo ${array[*]}或echo ${array[@]}获取数组里的所有元素
echo ${#array[*]}获取数组里所有元素个数
echo ${!array[*]}获取数组元素的索引下标
echo ${array[*]:1:2}访问指定的元素;1代表从索引下标为1的元素开始获取;2代表获取后面几个元素
echo ${array[*]:1:2} 获取数组中第二个和第三个元素
查看普通数组信息:
声明关联数组,
数组赋值:一次赋一个值:数组名[索引]=变量值
一次赋多个值:(关联数组要指定索引下标)
读取数组:
查看关联数组信息:
9. 交互式定义变量的值
-p 提示信息
-n 字符数 (限制变量值的字符数)
-s 不显示
-t 超时(默认单位秒)(限制用户输入变量值的超时时间)
一次性定义多个交互变量,定义多个变量时用空格隔开,输入多个变量值时用空格隔开,
从文件中获取内容给多个变量赋值,文件中内容也是要用空格隔开
10.1.1.1 255.255.255.0
从文件中获取内容给多个变量赋值,< 是标准输入
10.1.1.1
255.255.255.0