大家好呀!今天简单介绍一下Shell基础,包括变量、数组以及四则运算等方面内容。
1、变量
1.1 变量分类
1)本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
2)环境变量:当前进程有效,且能够被子进程调用。
env:查看当前用户的环境变量
set:查询当前用户的所有变量(临时变量与环境变量)
export:将当前变量变成环境变量
# 临时将一个本地变量(临时变量)变成环境变量
export A=hello
env|grep ^A
# 永久生效:
vim /etc/profile 或者 ~/.bashrc
# 系统中有一个变量PATH,即环境变量
3)全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用。
代码语言:powershell复制$HOME/.bashrc #当前用户的bash信息(aliase、umask等)
$HOME/.bash_profile #当前用户的环境变量
$HOME/.bash_logout #每个用户退出当前shell时最后读取的文件
/etc/bashrc #使用bash shell用户全局变量
grep --color=auto
umask
/etc/profile #系统和每个用户的环境变量信息
mycat_home=/usr/local/mycat/bin
export mycat_home
# 执行mycat命令
mycat
source /etc/bashrc
注:用户登录系统读取相关文件的顺序:/etc/profile——>$HOME/.bash_profile——>$HOME/.bashrc——>/etc/bashrc——>$HOME/.bash_logout
4)系统变量 : 即内置bash中的变量,shell本身已经固定好了它的名字和作用。
代码语言:powershell复制$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
若退出状态值为0,表示命令运行成功
若退出状态值为127,表示command not found
若退出状态值为126,表示找到了该命令但无法执行(权限不够)
若退出状态值为1&2,表示没有那个文件或目录
$$:当前所在进程的进程号 echo $$ eg:kill -9 `echo $$` = exit 退出当前会话
$!:后台运行的最后一个进程号 (当前终端)
!$:调用最后一条命令历史中的参数
!!:调用最后一条命令历史
$#:脚本后面接的参数的个数
$*:脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@: 脚本后面所有参数,参数是独立的,也是全部输出
$0:当前执行的进程/程序名 echo $0
$1~$9 位置参数变量
${10}~${n} 扩展位置参数变量 第10个位置变量必须用{}大括号括起来
注:$* 表示将变量看成一个整体
,$@ 表示变量是独立的
1.2 变量定义规则
1)默认情况下,shell里定义的变量是不分类型的,可以给变量赋予任何类型的值;等号两边不能有空格,对于有空格的字符串做为赋值时,要用引号引起来(变量名=变量值)
2)变量的获取方式: $变量名
或 ${变量名}
($符表示调用变量)
如果是获取变量的全部,两个都可以;如果是获取变量的某一部分,用${} 。eg:echo ${a:2:3},表示从变量a的第3个字符开始,往后连续获取三个字符。
3)取消变量(unset):unset 变量名
4)变量名区分大小写,变量名可以是字母或数字或下划线,但不能以数字开头,避免使用特殊字符和Shell关键字。
1.3 有类型变量
使用declare声明类型,常见如下:
-i:定义整数变量
-r:定义只读变量 readonly
-x:标记变量通过环境导出 export
-a:指定为索引数组(普通数组);查看普通数组
-A:指定为关联数组;查看关联数组
2、数组
1)普通数组:只能使用整数作为数组索引(下标)
2)关联数组:可以使用字符串作为数组索引(下标)
2.1 数组定义
普通数组定义:用括号来表示数组,数组元素(变量)用“空格”符号分割开。定义数组的形式为如下。
1)使用索引定义数组
一次赋一个值
代码语言:powershell复制# 变量名[索引]=变量值
array[0]=v1
array[1]=v2
array[3]=v3
2)用括号表示,元素之间用"空格"分隔
一次赋多个值
代码语言:powershell复制array=(var1 var2 var3 var4)
查看普通数组:declare -a
2.2 获取
以数组array为例。
${array[i]}:i为元素下标,使用@ 或 * 可获取数组中的所有元素
1)获取第一个元素(下标为0)
代码语言:powershell复制echo ${array[0]}
2)获取所有元素(*或@)
代码语言:powershell复制echo ${array[*]}
# 或
echo ${array[@]}
3)获取元素个数(#)
代码语言:powershell复制echo ${#array[*]}
4)获取索引下标(!)
代码语言:powershell复制echo ${!array[@]}
5)访问指定的元素
${array[*]:起始下标:结束下标}
echo ${array[@]:1:2}
3、关联数组
3.1 声明
declare -A 数组名
declare -A books
3.2 赋值
1)一次赋一个值(下标定义):
数组名[索引]=变量值
books[linux]=3
books[python]=2
books[java]=1
2)一次赋多个值(括号定义):
代码语言:powereshell复制names=([name1]=Bob [name2]=Jack [name3]=Lucy)
4、交互式定义变量的值
使用read命令,作用:可以让用户去定义变量值
代码语言:powereshell复制-p:提示信息
-n:字符数 (限制变量值的字符数)
-s:不显示
-t:超时,限制用户输入变量值的超时时间,默认单位秒
注:变量名字前要用空格隔开
5、其他变量
5.1 dirname & basename
作用:取出目录下的目录和文件。dirname取目录,basename取文件。
5.2 变量"内容"的删除 & 替换
注意左右方向
代码语言:powereshell复制1个“%”代表从右往左去掉一个/key/
2个“%%”代表从右往左最大去掉/key/
1个“#”代表从左往右去掉一个/key/
2个“##”代表从左往右最大去掉/key/
6、简单的四则运算
默认情况下,shell只支持简单的整数运算,如 、-、*、/、%(取模,求余数)
Bash shell 的四种算术运算方式:
1)使用$(( ))
2)使用$[ ]
3)使用expr 外部程式
,注意要空格。
4)使用let 命令