目录结构
一、Bash变量及其分类
二、用户自定义变量
1. 定义变量
2. 调用变量
3. 叠加变量
4. 查看变量
5. 删除变量
三、Bash环境变量
1. 设置环境变量
2. 查看环境变量
3. 删除环境变量
4. 常用环境变量
5. PATH环境变量
6. PS1变量
四、Bash语系变量
1. 当前语系查询
2. 语系变量LANG
3. 查询系统默认语系
五、位置参数变量
六、预定义变量
>接收键盘输入
一、Bash变量及其分类
1. 变量名规则:字母、下划线、数字组成,字母or下划线开头;长度≤255字符;名称唯一性
2. 变量类型:字符串型、整型、浮点型、日期型
PS:Shell/Bash中的变量默认类型为字符串类型
3. Shell变量类型:
(1)用户自定义变量:变量可自定义
(2)环境变量:保存系统操作环境相关的数据;可自定义,但对系统生效的环境变量名和变量作用是固定的
(3)位置参数变量:用来向脚本中传递参数or数据;变量名不能自定义,变量作用是固定的
(4)预定义变量:Bash中已定义好的变量,变量名不能自定义,变量作用是固定的
二、用户自定义变量
1. 定义变量
变量名=变量值
2. 调用变量
echo $变量名
PS:
1)定义变量时等号"="左右两侧不能留空格,否则不能被正确识别
2)定义变量不需要加符号$
,调用变量时则需要加符号$
3. 叠加变量
# 方式1:
"$变量名"xxx
# 方式2:
${变量名}xxx
如:
x=123
x="$x"456
x=${x}789
echo $x
![4866277-10f092f2d7b55584.png](https://upload-images.jianshu.io/upload_images/4866277-10f092f2d7b55584.png)
4. 查看变量
# 查询系统已生效的所有变量,包括默认的变量、自定义的变量
set
选项:
-u 调用未声明变量时会报错(默认无任何提示)
![4866277-54abb16e6852fff7.png](https://upload-images.jianshu.io/upload_images/4866277-54abb16e6852fff7.png)
![4866277-295a804a29513323.png](https://upload-images.jianshu.io/upload_images/4866277-295a804a29513323.png)
5. 删除变量
unset 变量名
PS:此时变量名前面不需要加符号$
,表示删除的是整个变量(变量名+变量值)
三、Bash环境变量
环境变量 VS 自定义变量:
环境变量是全局变量,可在当前Shell及其所有子Shell 中生效;自定义变量是局部变量,只在当前Shell中生效。
对系统生效的环境变量名和变量作用是固定的。
PS:
当前Shell:即当前命令窗口的界面
子SHell:通过当前命令查看的界面中输入bash
命令进入其子Shell
1. 设置环境变量
export 变量名=变量值
or
变量名=变量值
export 变量名
2. 查看环境变量
# 查看所有变量
set
# 查看环境变量
env
3. 删除环境变量
unset 变量名
4. 常用环境变量
HOSTNAME:主机名
SHELL:当前的shell
TERM:终端环境
HISTSIZE:历史命令条数
SSH_CLIENT:当前操作环境是用ssh连接的,此处记录客户端IP
SSH_TTY:ssh连接的终端
USER:当前登录的用户
![4866277-ccfbdfa3a2d55589.png](https://upload-images.jianshu.io/upload_images/4866277-ccfbdfa3a2d55589.png)
5. PATH环境变量
PATH变量:系统查找命令的路径
# 查看PATH环境变量
echo $PATH
# 增加PATH环境变量的值
PATH="$PATH":/xxx/yyy
6. PS1变量
echo $PS1
系统命令提示符设置:
![4866277-81f722fa2eb14222.png](https://upload-images.jianshu.io/upload_images/4866277-81f722fa2eb14222.png)
![4866277-2cfbf8082dcc5698.png](https://upload-images.jianshu.io/upload_images/4866277-2cfbf8082dcc5698.png)
四、Bash语系变量
1. 当前语系查询
# 查询当前系统的语系
locale
-LANG 定义系统主语系的变量
-LC_ALL 定义整体语系的变量
![4866277-9701ecf1042ff7ab.png](https://upload-images.jianshu.io/upload_images/4866277-9701ecf1042ff7ab.png)
2. 语系变量LANG
# 查看系统当前语系
echo $LANG
# 查看Linux支持的所有语系
locale -a | more
![4866277-9618cfac61b103b9.png](https://upload-images.jianshu.io/upload_images/4866277-9618cfac61b103b9.png)
3. 查询系统默认语系
cat /etc/sysconfig/i18n
![4866277-d17fa1f6652a90fc.png](https://upload-images.jianshu.io/upload_images/4866277-d17fa1f6652a90fc.png)
五、位置参数变量
位置参数变量,是预定义变量中的一类变量
位置参数变量 | 作用 |
---|---|
$n | 利用参数向程序中传递需要调用的值 n为数字,n≤9直接用数字,n≥10都需要用{}包含: $0表示命令本身 $1-$9表示第1-9个参数 ${10}表示第10个参数 |
$* | 表示命令行中所有的参数,所有参数看作一个整体 |
$@ | 表示命令行中的所有参数,每个参数区分对待 |
$# | 表示命令行中所有参数的个数(不统计$0) |
【案例1】编写bash脚本实现2个参数相加的效果
add2para.sh
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum
编辑脚本:vim add2para.sh
配置执行权限:chmod 755 add2para.sh
执行脚本:./add2para.sh 11 20
![4866277-68491a1adeec9a6e.png](https://upload-images.jianshu.io/upload_images/4866277-68491a1adeec9a6e.png)
【案例2】输出$*、$@、$#
t002.sh
#!/bin/bash
echo "\$*输出:$*"
echo "\$@输出:$@"
echo "\$#输出:$#"
![4866277-ca987823f1728b0f.png](https://upload-images.jianshu.io/upload_images/4866277-ca987823f1728b0f.png)
【案例3】$*与$@的差异
t003.sh
#!/bin/bash
# $* 中的所有参数看作一个整体,对应for循环只会循环一次(无论输入多少个数字)
for i in "$*"
do
echo "\$* 的参数为:$i"
done
# $@ 中的每个参数都会独立区分,即"$@"中有几个参数就会循环几次
for j in "$@"
do
echo "\$@ 的参数为:$j"
done
![4866277-959b8a44cae98c8a.png](https://upload-images.jianshu.io/upload_images/4866277-959b8a44cae98c8a.png)
六、预定义变量
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令所返回的状态: 若变量值为0,说明上一个命令正确执行 若变量值为非0,说明上一个命令执行不正确 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
应用场景:脚本中的上一条命令正确执行,才会执行下一条命令的时候,使用$?
![4866277-725372278c8f0904.png](https://upload-images.jianshu.io/upload_images/4866277-725372278c8f0904.png)
![4866277-559a7d7652296d25.png](https://upload-images.jianshu.io/upload_images/4866277-559a7d7652296d25.png)
![4866277-2a83e00f9b2eb73e.png](https://upload-images.jianshu.io/upload_images/4866277-2a83e00f9b2eb73e.png)
接收键盘输入
read [选项] [变量名]
选项:
-p 提示信息。在等待read输入时给出的提示信息
-t 等待时间(s)。read命令等待用户输入的时间
-n 字符数。read命令接收到指定的字符数即会执行
-s 隐藏输入的数据。适用于机密信息的输入
read命令与位置参数变量对比:
read命令适合提供给第三方用户使用,因其会给用户作输入提示,便于用户理解和操作;而位置参数变量则不适合给第三方用户使用,当其运行脚本后并不明确具体脚本的功能,比较适合是脚本编写者自己使用
t004.sh
#!/bin/bash
read -p "Please input your name: " -t 30 name
echo $name
read -p "Please input your password: " -s passwd
echo -e "\n"
echo $passwd
read -p "Please input your gender[M/F]: " -n 1 gender
echo -e "\n"
echo $gender
![4866277-12a5dc972bddf2ee.png](https://upload-images.jianshu.io/upload_images/4866277-12a5dc972bddf2ee.png)