文章目录
Shell脚本
shell 脚本就是将完成一个任务的所有的命令按照执行的先后顺序,自上而下的写入到一个文本文件中,然后给给予权限。
定义脚本的执行环境
#!/usr/bin/bash
注意;#不是注释
运行shell 脚本的方法
test1.sh 代码
#!usr/bin/bash
echo "holle word"
1.给执行权限
chmod u+x filename |
---|
chmod 700 test1.sh #给设置执行权限
./test1.sh #使用./file.sh 执行文件
holle word #打印结果
2.使用解释器直接运行
bash filename |
---|
bash test1.sh #使用bash 指令
holle word #打印结果
shell 中的特殊符号
符号 | 名称 | 解释 |
---|---|---|
~ | 家目录 | 使用 cd ~代表计入家目录 |
! | 执行历史命令 | !! 执行上一条命令 ! 后面跟字母匹配历史执行该字母最后执行的一次命令 |
$ | 变量中取内容符号 | |
+ - * \ % | 对应数学运算 | 加 减 乘 除 取余数 |
& | 后台执行 | |
* | 通配符 | 匹配所有 |
? | 通配符 | 匹配除回车以外的一个字符 |
; | 分号可以在shell中一行执行多个命令 | 命令之间用的是分隔符 |
| | 管道符 | 上一个命令的输出作为下一个命令的输入 ps -a | grep “xxx” |
\ | 转义符 | 表示下一个符号为特殊字符 |
` ` | 反引号命令中执行命令 | echo “today is `date +%F`" |
’ ’ | 单引号 | 脚本中字符串用单引号引起来,单引号不解释变量 |
" " | 双引号 | 脚本中出现的字符串可以用双引号引起来 ,解释变量 |
shell 特殊变量
符号 | 说明 |
---|---|
$0 | shell 的命令本身 |
$? | 显示最后命令的执行情况 |
$$ | 脚本运行的当前进程ID号 |
$# | 脚本传参的个数 |
$* | 以一个单字符显示所有像脚本传递的参数 |
$! | 后台运行的最后一个进程的ID号 |
$- | 显示shell使用的当前选项 |
$N | shell的第几个外穿参数 |
shell管道
管道符在shell中的使用是最多的。很多组合命令都需要通过组合命令来完成输出。管道符其实接收下一个命令对上一个命令
重定向
符号 | 作用 |
---|---|
> | 覆盖写入 |
>> | 注解写入 |
< | 从指定文件读取内容 |
<< | 追加输出 |
示例:
[root@root shellfile] touch test.txt //创建文本
[root@root shellfile] echo "您好" >test.txt //将echo 覆盖写入test.txt文件中
[root@root shellfile] cat test.txt // 读取test.text文件
您好
------------------------------------------------------------------------
[root@root shellfile] echo "您好" >>test.txt //追加写入
[root@root shellfile] cat test.txt //查看test.txt文件
您好
您好
------------------------------------------------------------------------
[root@root shellfile] cat <<-EOF >test.txt
> 测试
> 测试2
> EOF
[root@root shellfile] cat test.txt
测试
测试2
--------------------------------------------------------------------------
[root@root shellfile] cat < test.txt
测试
测试2
echo指令
指令 | 示例 |
---|---|
echo [选项] [输出内容] | echo “holle” |
选项:
-e: 支持反斜线控制的字符转换
-n : 不换行输出
echo -e 字符转换 | 解释 |
---|---|
\a | 输出警告音 |
\007 | 输出警告音,警告音可以和sleep配合 |
\b | 退格键,也就是向左删除键 |
\c | 取消输出行末的换行符。和“-n”选项一致 |
\e | ESCAPE键 就是esc键子 |
\033 | ESCAPE键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,也就是Tab键 |
\v | 垂直制表符 |
\0nnn | 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 |
\xhh | 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 |
\e[1; | 开启颜色 |
\e[0m | 关闭颜色 |
整数运算
指令 | 示例 |
---|---|
exper | exper 1 - 1 |
$(( )) | $((1 + 2)) |
$[ ] | $[1+2] |
expr 1 * 2 #注意数字 运算符直接需要加空格
2 #输出结果
$((0+2)) #使用该指令进行运算
2 #输出结果
read指令
默认接受键盘的输入,回车代表输入结束。
read [命令选项] | 解释 |
---|---|
-p | 打印信息 |
-t | 限定时间 |
-s | 不回显 |
-n | 输入字符的个数 |
read 指令使用后如果,如果想使用输入后的值,需要给read 后面添加变量名,然后使用$变量名获取输入值,示例如下
#!/var/bin/bash
echo -e -n "请输入用户名:";read user
#可以使用 read -p "请输入用户名:" 代替
echo -e -n "请输入密码" ;read pass
echo -n -e"用户名: $user 密码: $pass \n"
#调用该脚本
bash shell_02.sh
#执行结果
请输入用户名:user_01
请输入密码:pass_01
用户名: user_01 密码: pass_01
变量
变量名=值 |
---|
name =user |
age=1 |
读取变量内容
${变量名} |
---|
${name} |
${age} |
name="user"
echo name:${name}
取消变量
语法 |
---|
unset 变量名 |
unset name;
数组
数组定义
语法 | 作用 |
---|---|
数组名 = (value1 vaule2) | 创建数组 并一次赋多个值 |
数组名[索引值] = value | 给指定位置赋值 |
数组的读出
语法 | 作用 |
---|---|
${ 数组名称[索引值] } | 查看对应所以处的值,开始值为0 |
${ 数组名称[@] } | 查看数组所有元素 |
${数组名称[@]:1 } | 从数组下标1开始读取 |
${数组名称[@]:1:2} | 从数组下标1开始读取,读取两个元素 |
示例
#定义数组
array=(A' 'B' 'C')
#读出数组 并打印
echo ${array[0]}
查看数组
语法 | 作用 |
---|---|
declare -a | 查看系统中所有的数组 |
声明关联数组
类似于map集合
语法 | 作用 |
---|---|
declare -A 数组名 | 声音应该关联数组 |
关联数组赋值
语法 | 作用 |
---|---|
数组名称[key] ='value’ | 一次赋值添加一个元素 |
数组=(key1=value1 key2=value2) | 一次赋值多个元素 |
使用示例
#创建关联数组
declare -A array1
#给数组赋值 一次赋值多个
array1=(name='user' age='18')
#一次赋值一个
array[sex]='man'
#打印 array1中的name值
echo ${array1[name]}
流程控制语句-if判断语句
shell中的运算
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
1.1 数学比较运算
语法 | 说明 |
---|---|
-eq | 等于则为 ture |
-gt | 大于 则为 ture |
-lt | 小于 则为ture |
-ge | 大于或等于则为ture |
-le | 小于或等于则为ture |
-ne | 不等于则为ture |
示例
num1=100
num2=200
if test ${num1} -eq ${num2}
then
echo " 两个数相等"
else
echo "两个数不相等"
fi
#输出结果:
两个数相等
1.2 字符串比较运算
符号 | 说明 |
---|---|
= | 等于则为ture |
!= | 不相等则为ture |
-z 字符串 | 字符串长度为零则为ture |
-n 字符串 | 字符串的长度不为零则为ture |
var1="user1"
var2="user2"
if test $num1=$num2
then
echo "两个字符串相等"
else
echo "两个字符串不相等"
fi
#输出结果
两个字符串不相等
1.3文件运算
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
示例
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
#输出结果
文件已存在!
1.4 逻辑运算
参数 | 说明 |
---|---|
&& | 与 |
|| | 或 |
! | 非 |
1.5赋值运算
参数 | 说明 |
---|---|
= | 赋值 |
if 语法
2.1单if 语法
if [conition] #conition 值为true or false
then #当条件为真时 执行commands代码块
commands
fi #结束
2.2 if-else 语法
if [conition] #conition 值为true or false
then #当条件为真时 执行commands代码块
commands
else #当条件为假时 执行commands2
commands2
fi #结束
2.3 if-then-elif 语法
使用范围:多于两个以上的判断结果,也就是多于一个以上的判断条件
if [conition1] #conition1 值为true or false
then #conition1 为true时 执行commands1代码块
commands1
elif [conition2]
commands2 #conition2 为true时 执行commands2代码块
else #当条件都为假时 执行commands3代码块
commands3
fi #结束
for循环
for 语法一
for i in 写法
for i in vuale1 vuale2....
do
commands
done
for 语法2
C式for命令
for((变量;条件;自增减运算))
do
代码块
done
循环控制
3.1 sleep N 脚本执行到该步休眠N秒
#!/bin/bash
ehco -n "倒计时:"
for i in `seq 9 -1 1`
do
echo -n -e "\b$i" #\b 退格
sleep 1 #sleep 休眠一秒
done
echo
3.2 comtinue 跳过循环中的某次循环
示例默认输出1-9 ,但是使用continue 跳过输出5
for((i=1;i<10;i++))
do
if[$i -eq 5]
then
continue
else
echo $i
fi
done
3.3 break 跳出循环执行后续代码
shell流程控制-while 循环语句
while [ condition ] # 条件为真while 才会循环,条件为假,while 停止循环
do
commands
done
until 语句
与while 相反
until [codition] 注意,条件为假until 才会循环,条件为真,until停止循环
do
commands 代码块
done
case 语法
语法
case 变量 in
条件1)
执行代码块1
;;
条件2)
执行代模块2
;;
esac
shell函数
语法一
函数名(){
代码块
return N
}
语法二
function 函数名{
代码块
return N
}
正则表达式
定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一个锚定开头和结尾,做模糊匹配。
定位符 | 说明 |
---|---|
^ | 锚定开头^a 以a开头 默认锚定一个字符 |
$ | 锚定结尾 a$ 以a结尾 默认锚定一个字符 |
匹配符:匹配字符串
匹配符 | 说明 |
---|---|
. | 匹配除回车以外的任意字符 |
( ) | 字符串分组 |
[ ] | 定义字符类,匹配括号中的一个字符串 |
[^ ] | 表示否定括号中出现字符串类中的字符,取反 |
\ | 转移字符 |
| | 管道符 与 ( )关联使用 |
限定符:对面前的字符串或者字符串做限定说明
限定符 | 说明 |
---|---|
* | 某个字符之后加星号表示该字符不出现或出现多次 |
? | 与星号相似,但表示该字符只出现一次或者不出实现 |
{n,m} | 写在某字符之后,表示该字符最少出现n次,最多出现m次 |