目录
1、简介
1.1 变量的定义语法:
1.2 变量的定义需遵循的规则
1.3 变量的作用域
2、用户变量
2.1 定义变量
2.2 访问变量
2.3 变量的其他赋值方式
2.4 只读变量
2.5 删除变量
3、环境变量
3.1 常见的环境变量
3.2 自定义环境变量
4、特殊变量
1、简介
shell变量是一种很“弱”的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么含义。所以若要进行数学运算,必须使用一些命令例如let、declare、expr、双括号等。
在shell中有3种变量:用户变量、环境变量、特殊变量,其中用户变量在编程过程中使用量最多,环境变量主要是在程序运行时需要设置,特殊变量在对参数判断和命令返回值判断时会使用。
1.1 变量的定义语法:
变量名=变量值
1.2 变量的定义需遵循的规则
- 变量名可以由字母、数字和下画线组成,但是不能以数字开头。
- 在 Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须使用特殊命令。
- 变量用等号"="连接值,"="左右两侧不能有空格。
- 变量值中如果有空格,则需要使用单引号或双引号包含,如 test="hello world!"。双引号括起 来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符。
- 在变量值中,可以使用转义符"\"。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
1.3 变量的作用域
当前文件
2、用户变量
2.1 定义变量
在对变量赋于字符串值时,建议使用引号将其包裹。如果字符串中存在空格,请一定要使用单引号或双引号将整个内容包裹。
注意:单引号里的内容原封不动的输出,双引号里有变量的调用则会调用变量
[root@node1 shell]# username="geeker" |
2.2 访问变量
要对变量进行调用时,在变量名前加美元符号$
[root@node1 shell]# echo $username geeker |
如果需要增加变量的值,那么可以进行变量值的叠加。不够变量需要用双引号包含"$变量名"或${变量名}
[root@node1 ~]# usernmae="geeker" [root@node1 ~]# echo $usernamedb.log #这种方式不可以 .log [root@node1 ~]# echo "$username"db.log #可以 geekerdb.log [root@node1 ~]# echo ${username}db.log #可以 geekerdb.log |
测试脚本
脚本内容:test1.sh
#!/bin/bash string="I am shell" num=5 echo "a=${num},string=${string}" |
执行脚本
[root@node1 shell]# sh test1.sh a=5,string=I am shell |
2.3 变量的其他赋值方式
- 可以使用read关键字从键盘获取内容赋值给变量
- 可以通过$(linux命令)或者$`linux命令`来执行linux命令,并将命令的执行结果赋值给变量
脚本内容:test2.sh
#!/bin/bash echo "who are you?" read name #从键盘获取变量的值 pwd_string=$(pwd) #将当前的绝对路径赋值给pwd_string变量 date_string=`date` #将当前时间赋值给date_string变量,注意这里使用的是反引号 echo "hello, $name" echo $pwd_string echo $date_string |
执行脚本
[root@node1 shell]# sh test2.sh who are you? geeker hello, geeker /export/data/shell 2020年 05月 10日 星期日 16:50:21 CST |
2.4 只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
test3.sh
#!/bin/bash myUrl="http://www.google.com" readonly myUrl myUrl="http://www.runoob.com" |
运行脚本,结果如下:
/bin/sh: NAME: This variable is read only. |
2.5 删除变量
使用 unset 命令可以删除变量。语法:
unset variable_name
变量被删除后不能再次使用。unset 命令不能删除只读变量。
实例:
test4.sh
#!/bin/sh myUrl="http://www.runoob.com" unset myUrl echo $myUrl |
以上实例执行将没有任何输出。
3、环境变量
环境变量:当shell程序启动时,都自动设置一组变量,shell中的所有命令都可以使用这些变量。环境变量可以在/etc/profile中设置,环境变量的名字习惯上使用大写字母。
3.1 常见的环境变量
可以使用env命令查看所有的系统环境变量
[root@node1 shell]# env XDG_SESSION_ID=2 HOSTNAME=node1 SELINUX_ROLE_REQUESTED= TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=192.168.88.5 8047 22 CONDA_SHLVL=0 SELINUX_USE_CURRENT_RANGE= SSH_TTY=/dev/pts/0 USER=root |
常见的环境变量:
PATH 决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 当前用户Shell类型
LANGUGE 语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PS1 基本提示符,对于root用户是#,对于普通用户是$
3.2 自定义环境变量
1) vi /etc/profile ,在文件末尾加上要定义的环境变量,语法如下:
export 变量名=变量值
export SERVICE_HOST=www.geeker.cn |
2) wq 退出
3) source /etc/profile
4) 输入 env 查看环境变量,是否有自己定义的环境变量
5) 使用环境变量
环境变量的使用方式和普通变量是一样的:$环境变量名
[root@node1 shell]# echo $SERVICE_HOST www.geeker.cn |
4、特殊变量
我们可以在执行 Shell 脚本时,向脚本传递参数,这时候可以使用特殊变量来获取参数,Shell常用的特殊变量如下:
变量 | 解释 |
$# | 命令行参数的个数 |
$n | $1表示第一个参数,$2表示第二个参数,以此类推 |
$0 | 当前程序的名称 |
$? | 前一个命令或许或函数的返回码 |
$* | 以“参数1 参数2 。。。”形式保存所有参数 |
$@ | 以“参数1”“参数2”。。。形式保存所有参数 |
$$ | 本程序的(进程ID号)PID |
$! | 上一个命令的PID |
实例:
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:
test5.sh
#!/bin/bash echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3"; echo "参数个数为:$#"; echo "传递的参数作为一个字符串显示*:$*"; |
执行脚本:
[root@node1 shell]# chmod +x test5.sh [root@node1 shell]# ./test5.sh aaa bbb ccc Shell 传递参数实例! 执行的文件名:./demo4.sh 第一个参数为:aaa 第二个参数为:bbb 第三个参数为:ccc 参数个数为:3 传递的参数作为一个字符串显示*:aaa bbb ccc |
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " $* " 等价于 "1 2 3"(传递了一个参数),而 "$@" 等价于 "1" "2" "3"(传递了三个参数)
【下一章】
四、shell - 字符串
【往期回顾】
一、shell编程简介
二、shell编程快速入门