1、什么是变量
1.1 变量的定义
通俗:可以变的量就是变量。如:X=10,X=100,X先等于10,后等于100,这个X就是一个变量
1.2 变量的命名规则
- 以字母和下划线开头的,中间的只能由字母、数字下划线组成
- 变量名在有效的范围内必须唯一
- 在bash中,变量的默认类型都是字符串类型
- 命名必须有含义,方便查看。如:名字为name
1.3 变量的分类
- 用户自定义变量:变量是自定义的
- 环境变量:主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的
- 位置参数变量:主要用来想脚本中传递参数或数据的,变量名不能自定义,变量作用固定
- 预定义变量:是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
2、用户自定义变量
2.1 定义变量
变量名=变量值
2.2 变量的调用
echo $变量名
练习:调用变量
[root@catyuan ~]# x=12
[root@catyuan ~]# echo $x
12
2.3 变量的叠加
变量名="$变量名"叠加的内容
或
变量名=${变量名}叠加的内容
练习:
[root@catyuan ~]# echo $x
12
[root@catyuan ~]# x="$x"345
[root@catyuan ~]# echo $x
12345
[root@catyuan ~]# x=${x}67
[root@catyuan ~]# echo $x
1234567
2.4 变量的查看
set 查看系统中所有存在的变量
set -u 使用之后,调用未声明的变量时会报错(默认无提示)
练习:
[root@catyuan ~]# set -u
[root@catyuan ~]# echo $a
-bash: a: unbound variable
2.5 变量的删除
unset 变量名
3、环境变量
对系统生效的环境变量名和变量作用是固定的
3.1 环境变量与用户自定义变量的区别
用户自定义变量只在当前的shell中生效,环境变量在当前shell和这个shell的所有子shell中生效
环境变量是全局变量,用户自定义变量是局部变量
3.2 设置环境变量
export 变量名=变量值
或者
变量名=变量值
export 变量名
3.3 查看环境变量
set 查看所有变量
env 仅查看环境变量
3.4 变量的调用
echo $变量名
3.5 变量的删除
unset 变量名 ##不能在子shell中删除父shell的环境变量
3.6 常用的环境变量
HOSTNAME 主机名
SHELL 当前shell
TERM 终端环境
HISTORY 历史命令条数
SSH_CLIENT 当前操作环境是用ssh连接的,这里记录客户端IP
SSH_TTY ssh连接的终端时的pts/1
USER 当前登录的用户
3.7 PATH环境变量
PATH变量:系统查找命令的路径,路径用冒号分隔
查看PATH环境变量
[root@catyuan ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
增加PATH变量的值
PATH="$PATH":需要加的路径 ##临时生效
3.7 PS1环境变量
PS1变量:命令提示符设置
\d:显示日期,格式为“星期 月 日”
\H:显示完整的主机名
\t:显示24小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\$:提示符。root用户显示是“#”,普通用户为“$”
3.8 语系变量
3.8.1 查询当前系统语言
第一种:
[root@catyuan ~]# locale
LANG:定义系统主语言的变量 ##当前生效的
LC_ALL:定义整体语言的变量
第二种:
[root@catyuan ~]# echo $LANG
en_US.UTF-8
3.8.2查询linux中还支持的语言
[root@catyuan ~]# locale -a
3.8.3 默认系统语言
这个文件里的是下次开机之后生效的语言环境
[root@catyuan ~]# cat /etc/sysconfig/i18n ##7之前的版本
[root@catyuan ~]# cat /etc/locale.conf ##7版本
LANG="en_US.UTF-8"
4、位置参数变量
位置参数变量是预定义变量的一种
位置参数变量 | 作用 |
---|---|
$n | n为数字,$0代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 10 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,10以上的参数需要用大括号包含,如 9代表第一到第九个参数,10以上的参数需要用大括号包含,如{10} |
$* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
4.1.1 练习:求两数的和
[root@catyuan ~]# vim /root/sum.sh
#!/bin/bash
num1=$1
num2=$2
##变量sum是num1和num2
sum=$(($num1+$num2))
##打印变量sum的值
echo $sum
[root@catyuan ~]# chmod 755 /root/sum.sh
运行脚本
[root@catyuan ~]# /root/sum.sh 1 2 ##要在脚本后面加两个参数才能去运行
3
4.1.2 练习:
[root@catyuan ~]# vim /root/test.sh
#!/bin/bash
echo "\$#can shu shi:$#"
echo "\$*can shu ye shi:$*"
echo "\$@can shu ge shu shi:$@"
[root@catyuan ~]# /root/test.sh 11 22 33 44
$#can shu shi:4
$*can shu ye shi:11 22 33 44
$@can shu ge shu shi:11 22 33 44
4.1.3 练习: ∗ 与 *与 ∗与@的区别
[root@catyuan ~]# vim /root/test1.sh
#!/bin/bash
# $*中的参数是一个整体,所以这个循环只会循环一次
for i in "$*"
do
echo "$i"
done
# $@中有几个参数循环几次
for y in "$@"
do
echo "$y"
done
[root@catyuan ~]# chmod 755 /root/test1.sh
[root@catyuan ~]# /root/test1.sh 1 2 3 4 5
1 2 3 4 5
1
2
3
4
5
5、预定义变量
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量 的值不是0,则证明上一个命令执行错误。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID |
练习:$?
[root@catyuan ~]# ls
anaconda-ks.cfg Documents hello.sh la.log Music Public Templates test1.sh test.log Videos
Desktop Downloads initial-setup-ks.cfg ll.log Pictures sum.sh test1.log test2.log test.sh
[root@catyuan ~]# echo $?
0
[root@catyuan ~]# lkd
bash: lkd: command not found...
[root@catyuan ~]# echo $?
127