目录
用户自定义变量
环境变量
位置参数变量
预定义变量
Bash的运算符
数值运算与运算符
数值运算
运算符
变量测试与内容替换
变量设置规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
* 变量用等号连接值,等号左右两侧不能有空格。
* 变量的值如果有空格,需要使用单引号或双引号包括。
* 在变量的值中,可以使用“\”转义符。
* 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
* 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
* 环境变量名建议大写,便于区分。
变量分类
* 用户自定义变量(本地变量)
* 环境变量:这种变量中主要保存的是和操作系统环境相关的数据。
* 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。(位置参数变量其实是预定义变量的一种)
* 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
◇ 本地变量(即:用户自定义变量)
(1)变量定义
[root@localhost ~]# name="shen chao"
(2)变量叠加
[root@localhost ~]# aa=123
叠加方法1:变量=”$变量”String
[root@localhost ~]# aa="$aa"456
叠加方法2:变量=${变量}String
[root@localhost ~]# aa=${aa}789
(3)变量调用
[root@localhost ~]# echo $name
(4)变量查看 set : 会看到系统所有的变量,包括 环境变量 和 系统变量 以及 自定义变量。
[root@localhost ~]# set
(5)变量删除
[root@localhost ~]# unset name
用户自定义变量(本地变量)只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
举个例子理解一下:本地变量就相当于普通的人,只有自己家里人和自己的朋友认识;环境变量相当于这个普通的人在某个领域做成了一个很大的成就(比如刚出名的明星),在这个领域都会有人认识他;环境变量写入配置文件,相当于这个人作为明星已经很红了,几乎全国甚至全世界人都认识。
◇ 设置环境变量
使用pstree查看当前父shell和子shell
export 变量名=变量值 #声明变量
env #查询变量
unset 变量名 #删除变量
◇ 系统常见环境变量
PATH:系统查找命令的路径
[root@localhost ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PATH="$PATH":/root/sh #PATH变量叠加
◇ PS1:定义系统提示符的变量
\d:显示日期,格式为“星期 月 日”
\h:显示简写主机名。如默认主机名“localhost”
\t:显示24小时制时间,格式为“HH:MM:SS”
\T:显示12小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”
举例:
[root@localhost ~]# PS1='[\u@\t \w]\$ '
[root@04:50:08 /usr/local/src]#PS1='[\u@\@ \h \# \W]\$ '
[root@04:53 上午 localhost 31 src]#PS1='[\u@\h \W]\$ '
$n,n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}.
$* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数
创建一个shell脚本,canshu1.sh
接下来,直接执行,不带任何参数:
这样的结果相当于只执行了 $0,就是命令的本身。
接下来,带参数运行的结果:
例子1:$n 加法计算器,canshu2.sh
#!/bin/bash
num1=$1
num2=$2
sum=$(( $num1 + $num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值
例子2:$* $@ $# 分别演示,canshu3.sh
#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is: $*"
#使用$*代表所有的参数
echo "The parameters is: $@"
#使用$@也代表所有参数
感觉 $* 和 $@ 没看出区别,下面就来演示:
例子3:$*与$@的区别 ,canshu4.sh
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The parameter$x is: $y"
x=$(( $x +1 ))
done
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。 这个是给程序看的,在脚本中判断一个命令是否正确执行就使用 $?
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID) ,(canshu5.sh)
#!/bin/bash
# Author: renxing (E-mail: [email protected])
echo "The current process is $$"
#输出当前进程的PID。
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID
find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍
echo "The last one Daemon process is $!"
接收键盘输入 (read.sh)
[root@localhost ~]# read [选项] [变量名]
选项:
-p 提示信息:在等待read输入时,输出提示信息
-t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会执行
-s: 隐藏输入的数据,适用于机密信息的输入,比如输入密码时。
#!/bin/bash
# Author: renxing (E-mail: [email protected])
read -t 30 -p "Please input your name: " name
#提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中
echo "Name is $name "
read -s -t 30 -p "Please enter your age: " age
#年龄是隐私,所以我们用“-s”选项隐藏输入
echo -e "\n"
echo "Age is $age "
read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
#使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is $gender"
出现上面的原因是,Linux中的变量默认都是字符串类型的。
declare声明变量类型
[root@localhost ~]# declare [+/-][选项] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
扩展:将一个变量声明为环境变量,使用 export,此时查看会看到 –x
→ 方法1
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22 #给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb
→方法2:expr或let数值运算工具 (不是很推荐)
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22 #给变量aa和变量bb赋值
[root@localhost ~]# dd=$(expr $aa + $bb) #dd的值是aa和bb的和。注意“+”号左右两侧必须有空格
→方法3:“$((运算式))”或“$[运算式]”(比较直观,强烈推荐)
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(( $aa+$bb ))
[root@localhost ~]# gg=$[ $aa+$bb ]
优先级 运算符 说明
13 -, + 单目负、单目正
12 !, ~ 逻辑非、按位取反或补码
11 * , / , % 乘、除、取模
10 +, - 加、减
9 << , >> 按位左移、按位右移
8 < =, > =, < , > 小于或等于、大于或等于、小于、大于
7 == , != 等于、不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 =,+=,-=,*=,/=,%=,&=, ^=,|=, <<=, >>= 赋值、运算且赋值
备注:这里的“优先级”,数值越高,优先级越高!
[root@localhost ~]# aa=$(( (11+3)*3/2 )) #虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级
[root@localhost ~]# bb=$(( 14%3 )) #14不能被3整除,余数是2
[root@localhost ~]# cc=$(( 1 && 0 )) #逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0
例子1:测试x=${y-新值}
[root@localhost ~]# unset y #删除变量y
[root@localhost ~]# x=${y-new} #进行测试
[root@localhost ~]# echo $x
New #因为变量y不存在,所以x=new
[root@localhost ~]# y="" #给变量y赋值为空
[root@localhost ~]# x=${y-new} #进行测试
[root@localhost ~]# echo $x
[root@localhost ~]# y=old #给变量y赋值
[root@localhost ~]# x=${y-new} #进行测试
[root@localhost ~]# echo $x #结果:old