大家好呀!今天简单介绍一下Shell基础,包括变量、数组以及四则运算等方面内容。

1、变量

1.1 变量分类

1)本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。

2)环境变量:当前进程有效,且能够被子进程调用。

env:查看当前用户的环境变量
set:查询当前用户的所有变量(临时变量与环境变量)
export:将当前变量变成环境变量

1
2
3
4
5
6
7
# 临时将一个本地变量(临时变量)变成环境变量
export A=hello
env|grep ^A

# 永久生效:
vim /etc/profile 或者 ~/.bashrc
# 系统中有一个变量PATH,即环境变量

3)全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$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本身已经固定好了它的名字和作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$?:上一条命令执行后返回的状态,当返回状态值为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)使用索引定义数组

一次赋一个值

1
2
3
4
# 变量名[索引]=变量值
array[0]=v1
array[1]=v2
array[3]=v3

2)用括号表示,元素之间用”空格”分隔

一次赋多个值

1
array=(var1 var2 var3 var4)

查看普通数组:declare -a

2.2 获取

以数组array为例。

${array[i]}:i为元素下标,使用@ 或 * 可获取数组中的所有元素

1)获取第一个元素(下标为0)

1
echo ${array[0]}

2)获取所有元素(*或@)

1
2
3
echo ${array[*]}	
# 或
echo ${array[@]}

3)获取元素个数(#)

1
2
3
4
5
echo ${#array[*]}	
```
4)获取索引下标(!)
```powershell
echo ${!array[@]}

5)访问指定的元素

${array[*]:起始下标:结束下标}

1
echo ${array[@]:1:2}    

3、关联数组

3.1 声明

declare -A 数组名

1
declare -A books

3.2 赋值

1)一次赋一个值(下标定义):

数组名[索引]=变量值

1
2
3
books[linux]=3
books[python]=2
books[java]=1


2)一次赋多个值(括号定义):

1
names=([name1]=Bob [name2]=Jack [name3]=Lucy)

4、交互式定义变量的值

使用read命令,作用:可以让用户去定义变量值

1
2
3
4
-p:提示信息
-n:字符数 (限制变量值的字符数)
-s:不显示
-t:超时,限制用户输入变量值的超时时间,默认单位秒


注:变量名字前要用空格隔开

5、其他变量

5.1 dirname & basename

作用:取出目录下的目录和文件。dirname取目录,basename取文件。

5.2 变量”内容”的删除 & 替换

注意左右方向

1
2
3
4
1个“%”代表从右往左去掉一个/key/
2个“%%”代表从右往左最大去掉/key/
1个“#”代表从左往右去掉一个/key/
2个“##”代表从左往右最大去掉/key/

6、简单的四则运算

默认情况下,shell只支持简单的整数运算,如+、-、*、/、%(取模,求余数)

Bash shell 的四种算术运算方式:

1)使用$(( ))
2)使用$[ ]
3)使用expr 外部程式,注意要空格。
4)使用let 命令