1、定义变量
以固定的名称,存放可以有变化的值。
定义变量的格式:
变量名=变量值
取消变量的格式:
unset 变量名
注意事项:
=(等于号)两边不能有空格,不要使用关键字做变量名,例如 ls、cd 等。
如果变量名已经存在则覆盖之前的变量值。
变量名称有:字母、数字、下划线组成,不能以数字开头。
2、查看变量
查看变量的语法格式:
$变量名 或者 ${变量名}
花括号的使用:可以告诉计算机我们要使用的 变量名 是花括号里面的值。
[root@node2 ~]# x=12
[root@node2 ~]# var1=redhat
[root@node2 ~]# echo $x
12
[root@node2 ~]# echo $var1
redhat
[root@node2 ~]# echo ${var1}
redhat
[root@node2 ~]# echo ${var1}8.0
redhat8.0
[root@node2 ~]# unset x
[root@node2 ~]# echo $x
[root@node2 ~]#
3、变量的类型
(1)环境变量:变量名通常为大写,有操作系统维护。
存储在/etc/profile 或 ~/.bash_profile 中。
命令env可以列出所有环境变量。
常见的环境变量有:PATH、PWD、USER、UID、HOME、SHELL
[root@node2 ~]# echo $PATH
/usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@node2 ~]#
[root@node2 ~]# echo $UID
0
[root@node2 ~]# echo $USER
root
[root@node2 ~]#
PATH是命令搜索变量。
我们执行ls等命令后,输入后计算机会在PATH的路径中一级一级查找;如果我们将PATH定义为空,就会发现ls命令找不到了。(这是一个临时的定义,从新打开终端就会失效)
[root@node2 ~]# echo $PATH
/usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@node2 ~]# ls
anaconda-ks.cfg exam none shell_dir tmp.txt
Desktop index.html Pictures swap Videos
Documents initial-setup-ks.cfg pider Templates
Downloads Music Public tmp2.txt
[root@node2 ~]# PATH=
[root@node2 ~]# ls
-bash: ls: No such file or directory
[root@node2 ~]# find /
-bash: find: No such file or directory
[root@node2 ~]#
[root@node2 ~]#
(2)位置变量:bash内置变量,存储脚本执行时的参数。
存储脚本执行时的参数。使用$n表示,n为数字序列号。$1、$2、$3、......${10}、${11}、......
[root@node2 ~]# vim vars.sh
#!/bin/bash
echo $1
echo $2
echo $3
[root@node2 ~]#
[root@node2 ~]# bash ./vars.sh
[root@node2 ~]# bash ./vars.sh 11 22 33
11
22
33
[root@node2 ~]#
一个小应用:写一个创建用户和密码的脚本:
[root@node2 ~]# vim useradd.sh
#!/bin/bash
useradd $1
echo $2 | passwd --stdin $1
[root@node2 ~]# bash ./useradd.sh tom 123456
Changing password for user tom.
passwd: all authentication tokens updated successfully.
[root@node2 ~]#
[root@node2 ~]# grep tom /etc/passwd
tom:x:1006:1007::/home/tom:/bin/bash
[root@node2 ~]#
(3)预定义变量:bash内置变量,可以调用但是不能赋值或修改。
用来保存脚本程序的执行信息。
可以直接使用这些变量,不能为这些变量赋值。
变量名 | 含义 |
$0 | 当前所在的进程或者脚本名 |
$$ | 当前运行进程的PID号 |
$? | 命令执行后的返回状态,0表示正常,1或其他表示异常 |
$# | 已加载的位置变量的个数 |
$* | 所有位置变量的值 |
[root@node2 ~]# ls /home
harry hehe materials natasha redhat roo sarah tom
[root@node2 ~]# echo $?
0
[root@node2 ~]# vim pre.sh
#!/bin/bash
echo $0
echo $*
echo $#
echo $$
[root@node2 ~]# bash ./pre.sh aa bb cc dd
./pre.sh
aa bb cc dd
4
3733
[root@node2 ~]#
(4)自定义变量:用户自主设置的变量。
4、多种引号的区别
双引号" " :允许扩展,以$引用其它变量。
单引号' ':禁止扩展,即便$也视为普通字符。
反引号` `:将命令的执行输出作为变量值,$() 与反引号等效。
[root@node2 test]# touch a b c
[root@node2 test]# touch "a b c"
[root@node2 test]# ls
a 'a b c' b c
5、read标准输入取值
read从键盘读入变量值完成赋值。
格式: read [ -p "提示信息" ] 变量名
-p 可选,-t 可以指定超时秒数,-s 设置是否在终端显示输入的内容。
[root@node2 ~]# vim read.sh
#!/bin/bash
read -p "请输入用户名:" name
read -p "请输入密码:" -s pass
echo
useradd "$name"
echo "$name" | passwd --stdin "$name"
[root@node2 ~]# bash ./read.sh
请输入用户名:xixi
请输入密码:
Changing password for user xixi.
passwd: all authentication tokens updated successfully.
[root@node2 ~]#
6、变量的作用范围
局部变量:
新定义的变量默认只在当前Shell环境中有效,无法在子Shell环境中使用。
全局变量:
全局变量在当前Shell以及子Shell环境中均有效。
export 变量名=变量值 :定义全局变量。
[root@node2 ~]# x=11 #定义局部变量。
[root@node2 ~]# sh #进入子shell。
sh-4.4# echo $x #没有这个变量,输出为空。
sh-4.4# exit #退出子shell。
exit
[root@node2 ~]# export x=11 #定义全局变量。
[root@node2 ~]# sh
sh-4.4# echo $x
11
sh-4.4#