持续创作,加速成长!这是我参与「掘金日新计划 · 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
命令的一些简单用法。
如果对本篇文章对你有所帮助,可以点赞收藏评论支持一下我;如果有所疑问,欢迎私信~