目录
一、变量定义
变量命名规则:
变量的赋值:
只读变量:
删除变量:
二、变量的类型
自定义变量:
环境变量:
位置参数:
预定义变量:
三、键盘输入
四、数值运算
为什么数值需要特殊处理
声明变量类型
expr或let数值运算工具
$((表达是)) 或 $[表达式]
五、运算符
一、变量定义
变量命名规则:
-
可以包含字母,数字,下划线,首字母不能用数字开头,中间不能又空格
-
为变量赋值等号之间不能为空格
-
变量命名不能使用标点符号
-
不能使用 bash 的关键字
-
shell 中默认的变量的类型都是字符,就算是数字字符也会被认为是字符串,如果需要进行字符相加则必须指定变量为数值
-
如果定义的变量中没有空格,则定义变量时可以使用单引号或双引号,也可以使用,如:name=zs ,如果变量中包含了空格,则必须使用单引号或双引号引起来,如: "Kent Beck”
-
可以使用命令的结果作为变量的值,但必须使用 `` 或 $() 符号,如 : d=$(ls /etc) 获取 etc 目录下的所用文件赋给d
-
环境变量一般用大写,编程习惯
示例:
# 以下时合法的变量名
ABC
ROOT__PATH
_var
var2
# 以下时非法的变量名
12abc
?abc
变量的赋值:
# 显示负值
name="zs" #正确
name = "zs" #错误
# 变量的使用
echo $name
echo ${name} #也可以这样写,花括号是可选的
# 使用语句为变量赋值
for f in $(ls /etc) # 将/etc目录下的所有文件循环赋给f变量
for f in `ls /etc` # 这样写也可以
# 变量可以重新定义
name="ww"
echo $name
name="zl"
echo $name
只读变量:
# 定义只读变量,该变量不能修改
name="avdfd"
readonly name
# 运行时会提示该变量是只读变量
删除变量:
# 删除name变量
unset name
# set可以查看所有的变量,包括环境变量和用户自定义的变量
set
二、变量的类型
-
自定义变量:用户自己定义的变量,或者叫作本地变量
-
环境变量:保存和系统操作环境相关的变量,可以添加环境变量
-
位置变量:主要用于向脚本中传递参数或数据,变量名不能自定义,作用固定
-
预定义变量:在 Bash 中已经定义好的变量,变量的作用也是预先定义好的
自定义变量:
[root@localhost ~]# name=zs
[root@localhost ~]# echo
[root@localhost ~]# echo $name
zs
[root@localhost ~]# name="$name "123
#name变量加一个空格和123
[root@localhost ~]# echo $name
zs 123
[root@localhost ~]# name="$name"+234
#注意与其他编程语言不同,不能用+连接两个字符串
[root@localhost ~]# echo $name
zs 123+234
[root@localhost ~]# echo ${name} #也可以这样来用变量
环境变量:
用户自定义的变量也叫本地变量,只在定义它的当前shell中才也可以使用。环境变量会在当前shell和当 前shell的所有子shell中生效。 如果将环境变量写入相应的配置文件,则这个变量可以在所有的shell中 使用。可以理解为环境变量与本地变量的区别就是作用范围不同
设置环境变量
命令格式:export 变量名=变量值
查看:env
示例:
[root@localhost ~]# name=zs
[root@localhost ~]# export name
[root@localhost ~]# age=18
[root@localhost ~]# set
#在当前的shell中可以看到name和age变量
...
age=18
colors=/root/.dircolors
name=zs
[root@localhost ~]# bash
#打开一个子shell则只用看到name变量,也可以使用uset删除
[root@localhost ~]# set
...
name=zs
常见的环境变量:
PATH:
查找命令的路径,可以使用:
echo $PATH
查看。
位置参数:
$n
|
n
是数字,
$0
表示命令的本身,
$1-9
表示第
1
到第
9
个参数,
10
以上的参数需要用
{}
括起
来,例如:
${10}
|
$* |
表示命令行中的所有参数,
$*
把所有参数看成一个整体
|
$@ |
表示命令行中的所用参数,与
$*
不同的是
$@
把每个参数区分对待,可以将这个整体看作是
一个数组,数组中的每个元素都是独立的
|
$# |
代表命令行中所有参数的个数
|
示例:
[root@localhost ~]# vim paramdemo.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
[root@localhost ~]# ./paramdemo.sh 1 2 3 4
bash: ./paramdemo.sh: 权限不够
[root@localhost ~]# chmod 755 paramdemo.sh
[root@localhost ~]# ./paramdemo 1 2 3 4
bash: ./paramdemo: 没有那个文件或目录
[root@localhost ~]# ./paramdemo.sh 1 2 3
./paramdemo.sh
1
2
3
[root@localhost ~]# vim paramdemo02.sh
#!/bin/bash
echo "参数个数: $#"
echo "所有的参数(作为一个整体): $*"
echo "所有的参数(区分对待每个参数): $@"
[root@localhost ~]# chmod 755 paramdemo02.sh
[root@localhost ~]# ./paramdemo02.sh 1 2 3 4 5
参数个数: 5
所有的参数(作为一个整体): 1 2 3 4 5
所有的参数(区分对待每个参数): 1 2 3 4 5
预定义变量:
$? |
最后一次执行命令的返回状态,如值为
0
则说明成功,如值为非
0
,则说明命令执行不正确
|
$$ |
当前进程的进程号
|
$! |
后台运行的最后一个进程的进程号
|
示例:
[root@localhost ~]# ls
abc index.html index.html.2 paramdemo02.sh sh
anaconda-ks.cfg index.html.1 index.html.3 paramdemo.sh
[root@localhost ~]# echo $?
0
[root@localhost ~]# ls /fdfdf
ls: 无法访问/fdfdf: 没有那个文件或目录
[root@localhost ~]# echo $?
2
[root@localhost ~]#
三、键盘输入
命令:
read [
选项
] [
变量名
]
选项:
- -p 提示信息,等待输入时的提示
-
-t 秒数,用于指定等待的时间,单位时秒
-
-n 字符数,只要接收到指定的字符数就会执行
-
-s 隐藏输入的数据,用于机密信息的输入,比如密码
示例:
[root@localhost ~]# vim readdemo.sh
#!/bin/bash
read -t 60 -p "请输入账号: " userName
echo "输入的账号是: $userName"
read -s -t 60 -p "请输入密码:" password
echo -e "\n"
echo “输入的密码: $password”
read -n 1 -t 30 -p "请选择[y/n]" select
echo -e "\n"
echo "输入的选择是: $select"
[root@localhost ~]# chmod 755 readdemo.sh
[root@localhost ~]# ./readdemo.sh
请输入账号: zs
输入的账号是: zs
请输入密码:
“输入的密码: 123456”
请选择[y/n]y
输入的选择是: y
[root@localhost ~]#
四、数值运算
为什么数值需要特殊处理
在
shell
中变量默认都是字符型的,不管是其字面值是不是数值,所以当两个变量相加时,默认是字符串 拼接的操作,例如:
[root@localhost ~]# num1=1
[root@localhost ~]# num2=2
[root@localhost ~]# num3=$num1+$num2
[root@localhost ~]# echo $num3
1+2
声明变量类型
格式:
declare [+/-][
选项
]
变量名
-
- 给变量设置类型属性
-
+ 取消变量的类型属性,注意与我们的日常习惯不同
-
-i 将变量指定为整型
-
-x 将变量声明为环境变量
-
-p 显示指定变量被设置的类型
示例:
[root@localhost ~]# num1=1
[root@localhost ~]# num2=2
[root@localhost ~]# num3=$num1+$num2
[root@localhost ~]# echo $num3
1+2
[root@localhost ~]# declare -i num4=$num1+$num2
[root@localhost ~]# echo $num4
3
#此处是数值相加,而不是字符串相加了
[root@localhost ~]#
expr或let数值运算工具
[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# c=$(expr $a + $b)
#注意空格
[root@localhost ~]# echo $c
3
[root@localhost ~]#
$((表达是)) 或 $[表达式]
推荐使用的方式,示例:
[root@localhost ~]# a=5
[root@localhost ~]# b=6
[root@localhost ~]# c=$((a+b))
[root@localhost ~]# echo $c
11
[root@localhost ~]# a=8
[root@localhost ~]# b-9
-bash: b-9: 未找到命令
[root@localhost ~]# b=9
[root@localhost ~]# c=$[a + b]
[root@localhost ~]# echo $c
17
[root@localhost ~]#
五、运算符
优先级 | 运算符 | 说明 |
13 | -,+ | 单目,正负运算符 |
12 | !, ~ | 逻辑非,按位取反,或补码 |
11 | *, /, % | 乘,除,取余 |
10 | +, - | 加,减 |
9 | >>, << | 按位左移,按位右移 |
8 | >, <, <=, >= | 大于,小于,大于等于,小于等于 |
7 | ==, != | 等于,不等于 |
6 | & | 按位 |
5 | ^ | 按位异 |
4 | ||
3 | && | 逻辑 |
2 | ||
1 | =, +=, -=, *=, /=, %=, &=, ^= | 各种赋值 |
优先级的数值越大,优先级越高,注意和其他语言的数值月底优先级越高不同。
示例:
[root@localhost ~]# num = $(( (15 + 34) * 5 / 2 ))
-bash: num: 未找到命令
[root@localhost ~]# num=$(( (15 + 34) * 5 / 2 ))
[root@localhost ~]# echo num
num
[root@localhost ~]# echo $num
122
[root@localhost ~]# b=$((19%2))
[root@localhost ~]# echo $b
1
[root@localhost ~]# c=$(( 1 && 0 ))
[root@localhost ~]# echo $c
0
[root@localhost ~]#