【前端&运维那点事儿】六:迈向Shell的第二步:Shell变量

1,048 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

Hi~,我是一碗周,如果写的文章有幸可以得到你的青睐,万分有幸~

🍐 写在前面

先来介绍一下新开的这个专栏:《前端&运维那点事儿》将会从前端的角度,依次学习Linux→Nginx→Docker→持续集成→k8s,从而打造一个属于站在前端角度的运维专栏。

这篇文章介绍一下Shell中的变量;变量是什么这里就不解释了,变量是任何编程语言都必不可少的组成部分,变量可以用来存放各种数据;

🍓 LInux中的变量

Shell中的变量默认值都是字符串形式,变量名规范基本同其他编程语言一样:

  • 变量名由数字、字母、下划线组成;
  • 必须以字母或者下划线开头;
  • 不能使用Shell中的关键字作为变量名(通过help命令可以查看Shell中的保留字)。

🍒 自定义变量

在Shell中定义变量的语法如下:

name=[value]

注意:赋值号=的周围不能有空格

定义变量通常有以下四种方式:

name=          # name为空字符串
name1=value1   # 如果内容没有空格可以直接省略引号
name2='value2' # 下面解释单引号和双引号的区别
name3="value3"

定义之后我们如果想要**访问需要在变量名前面加上****$**符号,这里我们使用echo命令来打印我们自定义的变量,例子如下:

name=ywanzhou
echo $name
# 输出如下
ywanzhou

还可以**使用****${}**的方式使用一个变量,花括号内是变量名,更推荐这种方式,语义化更好

单引号和双引号定义变量是有区别的,在上一篇文章中,仅仅简单说了一下两个的区别,这里演示一下两者的具体区别,示例如下:

[root@ywanzhou ~]$ url1=https://github.com/ywanzhou
[root@ywanzhou ~]$ url2=https://github.com/ywanzhou
[root@ywanzhou ~]$ url3='一碗周的GItHub地址: ${url1}'
[root@ywanzhou ~]$ url4="一碗周的GitHub地址: ${url2}"
[root@ywanzhou ~]$ echo $url3
一碗周的GItHub地址: ${url1}
[root@ywanzhou ~]$ echo $url4
一碗周的GitHub地址: https://github.com/ywanzhou

单引号定义的字符串会原样输出;双引号会解析$、``;

除此之外,我们在上一篇文章中介绍的$()和反引号可以将命令的结果赋值给变量,示例代码如下:

[root@ywanzhou ~]$ text=`echo HelloWorld` # 将 echo HelloWorld 的结果赋值给 text 
[root@ywanzhou ~]$ echo $text             # 输出 text
HelloWorld                                # 使用 $() 有相同的效果

$()支持嵌套,反引号不行。

修改某个变量的值只需要对变量重新赋值即可

[root@ywanzhou ~]$ name=一碗周
[root@ywanzhou ~]$ echo $name
一碗周
[root@ywanzhou ~]$ name=ywanzhou
[root@ywanzhou ~]$ echo $name
ywanzhou

🍑 查询自定义变量

我们可以通过set命令来查询当前系统中已经生效的全部变量,包括系统变量和自定义变量:

[root@ywanzhou ~]$ set | grep "url[1,2,3,4]"
url1=https://github.com/ywanzhou
url2=https://github.com/ywanzhou
url3='一碗周的GItHub地址: ${url1}'
url4='一碗周的GitHub地址: https://github.com/ywanzhou'

🍏 删除变量

删除变量使用unset命令即可,示例如下:

unset url1 url2 url3 url4 # 删除这4个变量
# 也可以这么写
uset url[1,2,3,4]

🥭 只读变量

使用readonly命令可以创建只读变量,如果修改就会报错,示例如下:

[root@ywanzhou ~]$ readonly test='一碗周'
[root@ywanzhou ~]$ test='ywanzhou'
bash: test: readonly variable

🍎 变量的使用范围

前面那种自定义变量的方式默认只能在当前shell中生效,子进程不会继承这些变量;我们**可以通过****export**命令将这些变量放到环境中,这样新的进程也会从父进程那里继承环境;

示例如下:

[root@ywanzhou ~]$ name=一碗周
[root@ywanzhou ~]$ echo $name
一碗周
[root@ywanzhou ~]$ bash               # 在当前shell下开启新进程
[root@ywanzhou ~]$ echo $name         # 打印name变量,无内容

[root@ywanzhou ~]$ exit               # 退出开始的新进程
exit
[root@ywanzhou ~]$ export name        # 将name修改为环境变量
[root@ywanzhou ~]$ export age=18      # 创建一个age,为环境变量
[root@ywanzhou ~]$ bash
[root@ywanzhou ~]$ echo $name         # 可以正常访问
一碗周
[root@ywanzhou ~]$ echo $age
18

🍍 位置参数变量

这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的,主要有如下几个:

位置参数变量作用
${n}n为数字,${0}代表命令本身,${n}(n≥1)代表第n个参数,如果n<9花括号可以省略;
$*这个变量代表命令中所有的参数,$*把所有的变看数看成一个整体;
$#这个变量代表命令行中所有参数的个数

示例如下:

[root@ywanzhou ~]$ vim sum.sh
[root@ywanzhou ~]$ chmod 755 sum.sh # 添加可执行权限
[root@ywanzhou ~]$ ./sum.sh 10 20   # 执行该脚本,传递参数
这两个参数是10 20
这2个数的和为:30

sum.sh的内容如下:

#!/bin/bash
num1=$1
num2=$2
sum=$((num1+num2))
echo "这两个参数是$*"
echo "这$#个数的和为:${sum}"

其中第一行表示使用什么Shell执行该脚本,格式是#!Shell的绝对路径,第二行开始是我们的脚本。

🍌 预定义变量

预定义变量是已经定义好的变量,变量名不能自定义,变量作用也是固定的,如下表所示:

预定义变量作用
$?最后一次执行的命令的返回状态。0表示正确执行,非0表示不正确执行
$$当前进程的进程号(PID)
$!后台运行的最后一个进程号(PID)

演示如下:

[root@ywanzhou ~]$ echo $?    # 查看上一个命令是否执行成功
0
[root@ywanzhou ~]$ lll        # 故意执行失败一个命令
bash: lll: command not found
[root@ywanzhou ~]$ echo $?
127                           # 返回非0
[root@ywanzhou ~]$ echo $$    # 查看当前进程的PID
8894
[root@ywanzhou ~]$ ls &       # 通过 &的方式将该命令放到后台执行
[1] 12888
[root@ywanzhou ~]$ centos7.sh  cosfs.sh  dnspod.sh  install_panel.sh  install.sh  list.txt  sum.sh  txcdn.sh  wc.txt

[1]+  Done                    ls --color=auto
[root@ywanzhou ~]$ echo $!    # 查看后台执行的最后一个进程号
12888

🍋 read 命令

read命令的功能是用于读取单行数据内容,一般是从标准输入中读取数值,用于给变量赋值。

语法如下:

read [选项] 变量变量名

常用选项如下:

选项含义
-p提示信息,在等待read输入时,输出提示信息
-t秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间
-n字符数,read命令只接受指定的字符数,就会执行
-s隐藏输入的数据,适用于机密信息的输入
-e在输入的时候可以使用命令补全功能
-r禁用转义符(\)

示例如下:

#!/bin/bash
read -p 'please input your name:' -t 5 name
read -p 'please input you gender[m/f]:' -n 1 gender
echo -e "\n"
read -p 'please input your password:' -s password
echo $name,$gender,$password

🍊 写在最后

这篇文章介绍了Shell中的自定义变量以及Shell中的特殊变量,最后介绍了read命令的一些简单用法。

如果对本篇文章对你有所帮助,可以点赞收藏评论支持一下我;如果有所疑问,欢迎私信~