变量的定义
单双引号及倒引号区别
符号 | 含义 |
---|---|
“” | 除$`\保留其特殊功能外,其他字符均看作普通字符 |
‘’ | 单引号括起来的字符均看作普通字符 |
` | 倒引号括起来的字符串被shell解释为命令行,优先执行 |
变量定义规则
语法:变量名=变量值
规则:
1、变量名严格区分大小写
2、不能含有?*#等特殊字符
3、不能以数字开头
4、等号两边不能有空格
5、若变量值的字符串含有空格,需要用""或’‘
调用变量
语法一:$变量名
语法二:${变量名}
截取语法:${变量名:起始位置:长度}
[root@master ~]# A=123456
[root@master ~]# echo ${A:2:3}
345
交互式定义变量(read)
**目的:**让用户自己给变量赋值,比较灵活。
语法:read [选项] 变量名
常见选项:
选项 | 释义 |
---|---|
-p | 定义提示用户的信息 |
-n | 定义字符数(限制变量值的长度) |
-s | 不显示(不显示用户输入的内容) |
-t | 定义超时时间,默认单位为秒(限制用户变量值的超时时间) |
案例:
用法1:用户自己定义变量值
[root@master ~]# read -p "input your name:" name
jack
[root@master ~]# echo $name
jack
[root@master ~]# read -n 5 -p "input your name:" name
linux
[root@master ~]# echo $name
linux
[root@master ~]# read -s -p "input your password:" pass
[root@master ~]# echo $pass
123456
[root@master ~]# read -t 3 "input your name:" name
iiiiiiiiii
[root@master ~]# echo $name
用法2:变量值来自文件
[root@master ~]# cat 1.txt
10.0.0.1 255.255.255.0
[root@master ~]# read -p "input your IP and Netmask:" ip mask < 1.txt
[root@master ~]# echo $ip
10.0.0.1
[root@master ~]# echo $mask
255.255.255.0
定义有类型的变量(declare)
**目的:**给变量做一些限制,固定变量的类型,比如:整形、只读
用法:declare 选项 变量名=变量值
常用选项:
选项 | 释义 | 举例 |
---|---|---|
-i | 定义整数变量 | declare -i A=123 |
-r | 定义只读变量 | declare -r B=hello |
-a | 定义普通数组;查看普通数组 | |
-A | 定义关联数组;查看关联数组 | |
-x | 将变量通过环境导出 | declare -x AA=123 等于 export AA=123 |
常用的系统变量
变量名 | 含义 |
---|---|
$# | 命令行参数的个数 |
$n | $1表示第一个参数,$2表示第二个参数,依次类推 |
$0 | 当前程序的名称 |
$? | 前一个命令或函数的返回码 |
$* | 以“参数1 参数2…”形式保存所有参数 |
$@ | 以“参数1 参数2…”形式保存所有参数 |
$$ | 本程序的PID(进程id号) |
$! | 上一个命令的PID |
简单四则运算
算术运算:默认情况下,shell只能进行简单的整数运算
算术内容:加减乘除求余
四则运算符号:
表达式 | 举例 |
---|---|
$(()) | echo $((1+1)) |
$[] | echo $[10-5] |
expr | expr 10/5 |
let | n=1;let n+=1 |
次幂:n**3
,除expr外都可以进行次幂运算
小数运算:echo 1+1.5|bc
字符串截取与替换
表达式 | 含义 |
---|---|
${file#*/} | 删除file中第一个/及其左边的字符串 |
${file##*_} | 删除file中最后一个_及其左边的字符串 |
${file%_*} | 删除最后一个_及其右边的字符串 |
${file%%/*} | 删除第一个/及其右边的字符串 |
${file/old/new} | 将file中第一个old替换为new |
${file//old/new} | 将file中所有old替换为new |
字符串截取:${变量名:起始位置:长度}
[root@master ~]# file=AA_BB_CC_DD_11_22.file
[root@master ~]# echo "${file#*_}"
BB_CC_DD_11_22.file
[root@master ~]# echo "${file##*_}"
22.file
[root@master ~]# echo "${file%_*}"
AA_BB_CC_DD_11
[root@master ~]# echo "${file%%_*}"
AA
[root@master ~]# echo "${file/A/a}"
aA_BB_CC_DD_11_22.file
[root@master ~]# echo "${file//A/a}"
aa_BB_CC_DD_11_22.file
[root@master ~]# echo "${file:2:3}"
AA_CC_DD_11_22.file
注:若被替换的字符是/需要进行转义
条件判断语法结构
语法格式:
test 条件表达式
[ 条件表达式 ]
[[ 条件表达式 ]]
**注意:**2、3两种格式左右两端必须有空格
(一)判断文件类型
参数 | 含义 |
---|---|
-e | 判断文件是否存在 |
-f | 判断文件是否存在并且是一个普通文件 |
-d | 判断文件是否存在并且是一个目录 |
-s | 判断文件是否是存在并且是一个非空文件(有内容) |
-L | 判断文件是否存在并且是一个软链接文件 |
-b | 判断文件是否存在并且是一个块设备文件 |
(二)判断文件权限
参数 | 含义 |
---|---|
-w | 判断当前用户对其是否可读 |
-r | 判断当前用户对其是否可写 |
-x | 判断当前用户对其是否可执行 |
(三)判断整数
参数 | 含义 |
---|---|
-eq | 相等 |
-nq | 不等 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
(四)判断字符串
参数 | 含义 |
---|---|
-z | 判断是否为空字符串,字符串长度为0则成立 |
-n | 判断是否为非空字符串,字符串长度不为0则成立 |
string1=string2 | 判断字符串是否相等 |
string1!=string2 | 判断字符串是否不相等 |
(五)多重条件判断
符号 | 含义 | 举例 |
---|---|---|
-a 和 && | 逻辑与 | [ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ]&&[ 1 -ne 0 ] |
-o 和 || | 逻辑或 | [ 1 -eq 1 -o 1 -ne 0 ] [ 1 -eq 1 ]||[ 1 -ne 0 ] |
注意:
-a 和 &&:前面的表达式为真才进行后面的判断
-o 和 ||:前面的表达式为假才进行后面的判断
(六)类c风格判断
语法:((1==1))
((1!=1))
((1>1))
((1>=1))
**注意:**字符串比较时用双引号引起来,=和==都表示判断
流程控制语句
(一)if结构
if [ condition ]
then
command1
command2
fi
(二)if…else结构
if [ condition ]
then
command1
else
command2
fi
(三)if…elif…else结构
if [ condition1 ]
then
command1
elif [ condition2 ]
then
command2
else
command3
fi
(四)层层嵌套结构
if [ condition1 ]
then
if [ condition2 ]
then
command1
else
command2
fi
else
command3
fi
for循环语句
(一)列表循环
基本语法格式:
for variable in {list}
do
command1
command2
...
done
or
for variable in a b c
do
command1
command2
...
done
举例:
[root @master ~]# for i in {1,2,3};do echo $i;done
1
2
3
[root @master ~]# for i in {1..5};do echo $i;done
1
2
3
4
5
[root @master ~]# for i in a b c;do echo $i;echo "hello$a";done
a
helloa
b
hellob
c
helloc
脚本实现:
[root @master ~]# vim test_for.sh
#!/bin/env bash
#for语句列表循环测试
#写好脚本后保存退出,不会请学习vim编辑器
for i in {1..5}
do
echo $i
echo "hello$i"
done
[root @master ~]# chmod +x test_for.sh
[root @master ~]# ./test_for.sh
1
hello1
2
hello2
3
hello3
4
hello4
5
hello5
(二)不带列表的循环
**注意:**不带列表的for循环由用户指定参数和参数的个数
基本语法格式:
for variable
do
command1
command2
...
done
举例:
[root @master ~]# vim test2_for.sh
#!/bin/env bash
#不带列表的for循环参数由用户传递
for i
do
echo $i
done
[root @master ~]# chmod +x test2_for.sh
[root @master ~]# ./test2_for.sh 1 2 3
1
2
3
(三)类c风格的for循环
基本语法结构
for ((expr1;expr2;expr3))
do
comand1
comand2
done
expr1:定义变量并赋初值
expr2:循环条件判断
expr3:变量如何改变
举例:
[root @master ~]# vim test3_for.sh
#!/bin/env bash
#类c风格的for循环测试
for ((i=1;i<=3;i++))
do
echo $i
done
[root @master ~]# chmod +x test3_for.sh
[root @master ~]# ./test3_for.sh
1
2
3
while循环结构
while循环语法结构
**特点:**条件为真进入循环,条件为假退出循环
while 条件判断语句
do
command1
command2
...
done