什么是Shell的变量和数组?如何定义与使用?

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

1、变量

1.1 变量分类

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

3c8d8a347af86c0df126d5c146ddfcf1.png

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

env:查看当前用户的环境变量

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

export:将当前变量变成环境变量

56bf51de73fc583a65f0d0cdd896d8ea.png

# 临时将一个本地变量(临时变量)变成环境变量
export A=hello	
env|grep ^A

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

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

$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本身已经固定好了它的名字和作用。

$?:上一条命令执行后返回的状态,当返回状态值为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:指定为关联数组;查看关联数组

553a67f773c50de4cedef8cffdaa5e71.png

2、数组

1)普通数组:只能使用整数作为数组索引(下标)

2)关联数组:可以使用字符串作为数组索引(下标)

2.1 数组定义

普通数组定义:用括号来表示数组,数组元素(变量)用“空格”符号分割开。定义数组的形式为如下。

1)使用索引定义数组

一次赋一个值

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

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

一次赋多个值

array=(var1 var2 var3 var4)

查看普通数组:declare -a

2.2 获取

以数组array为例。

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

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

echo ${array[0]}

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

echo ${array[*]}	
# 或
echo ${array[@]}

3)获取元素个数(#)

echo ${#array[*]}

4)获取索引下标(!)

echo ${!array[@]}

5)访问指定的元素

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

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

aca9bb0719c54a83e91556f62db613d8.png

3、关联数组

3.1 声明

declare -A 数组名

declare -A books

3.2 赋值

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

数组名[索引]=变量值

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

2e08f31ae7d37b325baccf8c96591cc2.png

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

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

1beec5fb73b035ee41f6d90012526a8f.png

4、交互式定义变量的值

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

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

c3e7494e559180d77e65b873444a8de8.png

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

5、其他变量

5.1 dirname & basename

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

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

注意左右方向

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

a559c018a022973c71c7d486a669f1d5.png

6、简单的四则运算

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

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

1)使用$(( ))

2)使用$[ ]

3)使用expr 外部程式注意要空格。

4)使用let 命令

40cec76550d9f7909a376524aa0b6670.png


好了,以上就是今天这篇文章的全部内容了。 如果你想及时看到我的文章,只需做这几个动作: 点星标、点在看(包括赞)、评论、分享 ,我就会经常出现在您的常读列表,后面更新都会提醒。感谢大家的关注和支持, 祝大家生活美满,学业有成,事业蒸蒸日上!

最后,星标设置如下:

0f80b0f14db251c2a6f78527fdc9614d.png

如下即设置成功!

ca2bd1817491414f351300befbc283f7.png


往期精彩文章推荐 (点击下方蓝字即可阅读!)

往期推荐

最受欢迎互联网公司排行榜,速来围观!

什么是Shell?怎么编写和执行Shell脚本?

什么是DNS服务?域名解析的工作原理是什么?

7.24运维日,只有运维才懂的压力

一文带你快速理解什么是Samba服务

什么是生成式AI?什么是AIGC?

一文带你快速理解什么是NFS?


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农后端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值