shall 2-13
1.用一句话概括Shell
Shell是一个解释器,介于应用程序(用户)和操作系统之间的一个桥梁,负责命令的解释
2.Shell的编程语言
编译型语言:
程序在执行之前需要个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依养编译器,跨平台性差些。如C、C++、java
解释型语言:
程序不需要编译,程序在运行时由解释器翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/javaScript/Shell等都是解释型语言。
Shell的解析器:
/bin/sh 是bash的一个快捷方式
/bin/bash(最多) bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin 表示非交互,不能登录操作系统
/bin/dash 小巧,高效,功能相比少一些
/bin/tcsh 具有C语言风格的一种shell,具有许多特性,但是也有一些缺陷
/bin/csh 是csh的增强版本,完全兼容csh
[ljh@Linux2 ~]$ ll /bin | grep bash
-rwxr-xr-x. 1 root root 942200 3月 23 2017 bash
lrwxrwxrwx. 1 root root 4 2月 3 23:07 sh -> bash
Shell编程语言目的:
写脚本
学习Shell语言的方法:
最简单的语言、技巧(多看、多读、借鉴、思考)
使用场景:
完成自动化的工作:自动化部署、自动化的分析等 ( 自动化运维 )
什么是脚本?
脚本就是将需要执行的命令保存到文本中,按照顺序执行(由上往下执行),它是解释型的,不需要编译。
布置一个简单的任务:(执行mkdir -p class22/test)
1.删除class22中的test文件夹
2.在class22文件夹中新建一个test2 文件夹,在test2中新建dir1、dir2、dir3三个子目录
3.在dir2中新建一个class22.txt文件,
4.往class22.txt文件中写入libai
5.打印一句话"任务执行完毕 2020-2-12 10:24"
写一个脚本
step1在第一行(指明解析器):#!/bin/bash 或者 #!/bin/env bash
step2添加描述信息:(脚本名称、路径、描述、创建时间、修改时间、编辑人)
step3编写脚本主体代码
#!/bin/bash
#NAME:test03.sh
#DESC:第一个脚本任务
#CREATETIME:2020-2-12 10:44
#CREATE:wangwu
#PATH:/root/class22_shell
<<EOF
asnckas
jsacbsal
EOF
<<!
a KD
asc las
!
#1.删除class22中的test文件夹
rm -rf /root/class22_shell/class22/test
#2.在class22文件夹中新建一个test2 文件夹,在test2中新建dir1、dir2、dir3三个子目录
mkdir -p /root/class22_shell/class22/test2/dir{1..3}
#3.在dir2中新建一个class22.txt文件
touch /root/class22_shell/class22/test2/dir2/class22.txt
#4.往class22.txt文件中写入libai
echo libai >> /root/class22_shell/class22/test2/dir2/class22.txt
#5.打印一句话"任务执行完毕 2020-2-12 10:24"
echo "任务执行完毕 `date "+%Y-%m-%d %H:%M:%S"`"
step4:执行脚本
执行方式一:
sh/bash 绝对路径|相对路径
source 绝对路径|相对路径
执行方式二:(注意脚本中的指定的解析器一定不要写错)
推荐的执行方式:给脚本添加执行权限
chmod +x 脚本名称
执行:./脚本名称
如果需要在任意地方执行脚本,需要将脚本移动至/bin目录
执行:脚本名称
扩展命令
bash -n test03.sh 检查脚本语法错误
bash -x test03.sh 查看脚本的执行流程(步骤)
Shell中的变量
JAVA中的变量:
修饰符 类型 变量名称
private string name="张三";
1.系统变量
$HOME、$PWD、$SHELL、$USER等
2.自定义变量(shell中的变量没有明显的数据类型区分)
普通变量
定义变量:变量名=值 (注意:1.等号两边不要出现空格 2.变量名称不要有特殊字符 3.变量名称不能以数字和特殊字符开头)
读取变量:echo $变量名
撤销变量:unset 变量名
静态变量(一旦创建,只可读): readonly 变量名=值
变量的作用域(只在当前会话和当前用户下有效)
全局环境变量(export)
定义变量:export 变量名=值
全局环境变量的作用域(只在当前会话下的所有用户有效)
系统环境变量
vim /etc/profile
#系统环境变量
export CLASS22=ljh
一定要激活:source /etc/profile
系统环境变量的作用域(针对于所有会话下的所有用户都有效)
查看所有变量
使用set命令
特殊的变量
#!/bin/bash
<<EOF
特殊变量介绍和使用
$n 功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$#:获取所有输入参数个数,常用于循环
$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$?:表示读取命令的直接结果状态,返回的变量值为0,说明执行成功,非0则失败
EOF
echo $0 $1 $2 ${11}
echo "参数的个数为:" $#
echo "$/*" $*
echo "$/@" $@
==================================Shell中的数组
JAVA中的数组:
String[] fields={"a","b","c",....}
Shell中的数组:
数组名=(元素 元素 元素 元素 元素) 元素之间以空格分割,索引从0开始,自增
arr=(1 2 3 4 5 6 7)
根据索引读取数组元素:echo ${arr[0]}
获取数据组的长度:echo ${#arr[*]} | echo ${#arr[@]}
获取数组中所有的元素:echo ${arr[*]} | echo ${arr[@]}
修改数组:
(1)可以直接给变量重新赋值
(2)可以根据所有修改数组例如:arr[1]=c
for循环遍历数组
#!/bin/bash
myarray=(1 2 3 4 5 6 7 8 9)
for i in ${myarray[@]}
do
echo $i
done
================运算符
JAVA中的运算:
private int num1=6
private int num2=3
int result=num1/num2
Shell中的运算:
“$((运算式))”或“$[运算式]” + , - , *, /, % 加,减,乘,除,取余
echo $(($A/$B)) | echo $[$A/$B]
echo $(($A+$B)) | echo $[$A+$B]
echo $(($A-$B)) | echo $[$A-$B]
echo $(($A%$B)) | echo $[$A%$B]
echo $[(3+5)*$A]
expr + , - , \*, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
expr $A \* $B
expr `expr 3 + 5 ` \* $A
小数运算格式
echo $(echo "scale=1;5/2" | bc)
==========Shell中的条件判断
JAVA中的条件判断
private int num1=6
private int num2=3
if(num1>num2){
sout(.....)
}else{
sout(.....)
}
Shell中的条件判断
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ jinghang ]返回true,[] 返回false。
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
[ $A -lt $B ] :比较变量A是否小于变量B
(2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
[ -w test06.sh ] : 判断文件是否有可写权限
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
[ -f test04.sh ] :判断文件是否存在,并且是一个常规文件
多条件判断:多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
[root@Linux2 class22_shell]# [ -e test100.sh ] || echo "FALSE"
FALSE
[root@Linux2 class22_shell]# [ -e test04.sh ] && echo "TRUE"
TRUE
Shell重中之重点(流程控制)
JAVA if条件判断
private int num1=6
private int num2=3
if(num1>num2){
sout(.....)
}else{
sout(.....)
}
Shell中的条件判断
if [ 条件判断式 ]
then
主体代码
fi
------------------------
if [ 条件判断式 ]
then
主体代码
elif [条件判断式]
then
主体代码
else
主体代码
fi
------------------------------
if [ 条件判断式 ]
then
主体代码
else
主体代码
fi
---------------------
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
完成一个脚本,传入一个文件的名称,如果改文件是一个常规文件
(1)往这个常规文件中写入 bbbb
(2)如果不是常规文件,打印该文件不是常规文件
#!/bin/bash
if [ -f $1 ]
then
echo bbbb >> $1
else
echo "这个文件不是一个常规文件"
fi
完成一个脚本,传入两个参数,
判断参数大小,用大的减小的,
如果相等,则输出两个数值相同
#!/bin/bash
if [ $1 -gt $2 ]
then
echo $[$1-$2]
elif [ $1 -lt $2 ]
then
echo $[$2-$1]
else
echo "两个参数的数值相同"
fi
=======shell中case的使用
JAVA中的switch
int a = 111;
switch(a){
case 111:
.....;
break;
case 222:
.....;
break;
....
default:
.....;
break;
}
shell中case的使用
注意事项:
1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2)双分号“;;”表示命令序列结束,相当于java中的break。
3)最后的“*)”表示默认模式,相当于java中的default。
写一个脚本
如果传入的数字是2;打印2
如果传入的数字是3;打印3
如果传入的数字是4;打印4
其他的数字:打印"其他"
#!/bin/bash
case $1 in
1)
echo "1"
;;
2)
echo "2"
;;
3)
echo "3"
;;
*)
echo "其他"
;;
esac
=======for循环====================
JAVA中的for循环
for(i=0;i<100;i++){
}
for xxx in xxx{
}
Shell中的for循环
写法一
sum=0
for((i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
写法二
<<EOF
$*:读取传入脚本中的全部参数,把参数看作一个整体
$@:读取传入脚本中的全部参数,把参数区分对待
EOF
for i in "$*"
do
echo "$/*" $i
done
for j in "$@"
do
echo "$/@" $j
done
======while循环
JAVA中的while循环
while(i<100){
主体代码
}
Shell中的while循环
while [ 条件判断式 ]
do
程序
done
样例:
#!/bin/bash
<<EOF
while 循环完成1到100之间的所有基数的和
EOF
i=1
sum=0
while [ $i -le 100 ]
do
if [ $[$i%2] -ne 0 ]
then
sum=$[$sum+$i]
fi
i=$[$i+1]
done
echo $sum
流程控制:if case for while
=========read读取控制台输入的参数========
#!/bin/bash
read -t 5 -p "请输入一个数字" A
echo $A
#判断参数存不存在
if [ ! -n "$A" ]
then
echo "没有获取到参数"
else
i=1
sum=0
while [ $i -le $A ]
do
if [ $[$i%2] -ne 0 ]
then
sum=$[$sum+$i]
fi
i=$[$i+1]
done
echo $sum
fi
==========================函数===============
系统函数
basename作用:从文件的绝对路径中,获取文件的名称,可以去除文件的后缀
[root@Linux2 class22_shell]# basename /root/class22_shell/while12.sh
while12.sh
[root@Linux2 class22_shell]# basename /root/class22_shell/while12.sh .sh
while12
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
[root@Linux2 class22_shell]# dirname /root/class22_shell/while12.sh
/root/class22_shell
自定义函数
#!/bin/bash
<<EOF
使用Shell中的函数完成两个数字的累加
EOF
函数的创建
function print()
{
echo "hello word"
return 2
}
函数的创建
function add()
{
sum=0
sum=$[$1+$2]
echo $sum
}
read -t 5 -p "请输入第一个参数" arg1
read -t 5 -p "请输入第一个参数" arg2
函数的调用
add $arg1 $arg2
print
注意:调用函数时,直接写函数名完成调用,一定要注意,调用一定要在函数下
1.无参无返回值
2.无参数,有返回值 (返回值使用return,0~255之间)
3.有参,有返回值
4.有参,无返回值
================正则表达式======
单字符匹配
. 匹配除了换行符之外的任意字符
\d 匹配数字0~9 =>[0-9]
\D 匹配非数字 => [^0-9]
[a-z] 匹配字符a-z
\s 匹配空白字符
\S 表示匹配非空白字符
\w 表示匹配单词字符[a-zA-Z0-9_]
\W 表示匹配非单词字符
....
^ 表示匹配以...开头
$ 表示匹配以...结尾
多字符匹配(贪婪模式,尽可能多的匹配)
* :表示匹配*号前的字符(表达式)任意次(0~无限次)
+ :表示匹配*号前的字符(表达式)至少1次
?:表示匹配?号前的字符(表达式)0~1次
{n}: 表示匹配{n}号前的字符n次
{n,m}: 表示匹配{n,m}号前的字符n~m次
非贪婪模式(尽可能少的匹配)
*?
+?
??
其他
| 或
() 分组
1.用一句话概括Shell
Shell是一个解释器,介于应用程序(用户)和操作系统之间的一个桥梁,负责命令的解释
2.Shell的编程语言
编译型语言:
程序在执行之前需要个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依养编译器,跨平台性差些。如C、C++、java
解释型语言:
程序不需要编译,程序在运行时由解释器翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/javaScript/Shell等都是解释型语言。
Shell的解析器:
/bin/sh 是bash的一个快捷方式
/bin/bash(最多) bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin 表示非交互,不能登录操作系统
/bin/dash 小巧,高效,功能相比少一些
/bin/tcsh 具有C语言风格的一种shell,具有许多特性,但是也有一些缺陷
/bin/csh 是csh的增强版本,完全兼容csh
[ljh@Linux2 ~]$ ll /bin | grep bash
-rwxr-xr-x. 1 root root 942200 3月 23 2017 bash
lrwxrwxrwx. 1 root root 4 2月 3 23:07 sh -> bash
Shell编程语言目的:
写脚本
学习Shell语言的方法:
最简单的语言、技巧(多看、多读、借鉴、思考)
使用场景:
完成自动化的工作:自动化部署、自动化的分析等 ( 自动化运维 )
什么是脚本?
脚本就是将需要执行的命令保存到文本中,按照顺序执行(由上往下执行),它是解释型的,不需要编译。
布置一个简单的任务:(执行mkdir -p class22/test)
1.删除class22中的test文件夹
2.在class22文件夹中新建一个test2 文件夹,在test2中新建dir1、dir2、dir3三个子目录
3.在dir2中新建一个class22.txt文件,
4.往class22.txt文件中写入libai
5.打印一句话"任务执行完毕 2020-2-12 10:24"
写一个脚本
step1在第一行(指明解析器):#!/bin/bash 或者 #!/bin/env bash
step2添加描述信息:(脚本名称、路径、描述、创建时间、修改时间、编辑人)
step3编写脚本主体代码
#!/bin/bash
#NAME:test03.sh
#DESC:第一个脚本任务
#CREATETIME:2020-2-12 10:44
#CREATE:wangwu
#PATH:/root/class22_shell
<<EOF
asnckas
jsacbsal
EOF
<<!
a KD
asc las
!
#1.删除class22中的test文件夹
rm -rf /root/class22_shell/class22/test
#2.在class22文件夹中新建一个test2 文件夹,在test2中新建dir1、dir2、dir3三个子目录
mkdir -p /root/class22_shell/class22/test2/dir{1..3}
#3.在dir2中新建一个class22.txt文件
touch /root/class22_shell/class22/test2/dir2/class22.txt
#4.往class22.txt文件中写入libai
echo libai >> /root/class22_shell/class22/test2/dir2/class22.txt
#5.打印一句话"任务执行完毕 2020-2-12 10:24"
echo "任务执行完毕 `date "+%Y-%m-%d %H:%M:%S"`"
step4:执行脚本
执行方式一:
sh/bash 绝对路径|相对路径
source 绝对路径|相对路径
执行方式二:(注意脚本中的指定的解析器一定不要写错)
推荐的执行方式:给脚本添加执行权限
chmod +x 脚本名称
执行:./脚本名称
如果需要在任意地方执行脚本,需要将脚本移动至/bin目录
执行:脚本名称
扩展命令
bash -n test03.sh 检查脚本语法错误
bash -x test03.sh 查看脚本的执行流程(步骤)
Shell中的变量
JAVA中的变量:
修饰符 类型 变量名称
private string name="张三";
1.系统变量
$HOME、$PWD、$SHELL、$USER等
2.自定义变量(shell中的变量没有明显的数据类型区分)
普通变量
定义变量:变量名=值 (注意:1.等号两边不要出现空格 2.变量名称不要有特殊字符 3.变量名称不能以数字和特殊字符开头)
读取变量:echo $变量名
撤销变量:unset 变量名
静态变量(一旦创建,只可读): readonly 变量名=值
变量的作用域(只在当前会话和当前用户下有效)
全局环境变量(export)
定义变量:export 变量名=值
全局环境变量的作用域(只在当前会话下的所有用户有效)
系统环境变量
vim /etc/profile
#系统环境变量
export CLASS22=ljh
一定要激活:source /etc/profile
系统环境变量的作用域(针对于所有会话下的所有用户都有效)
查看所有变量
使用set命令
特殊的变量
#!/bin/bash
<<EOF
特殊变量介绍和使用
$n 功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$#:获取所有输入参数个数,常用于循环
$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$?:表示读取命令的直接结果状态,返回的变量值为0,说明执行成功,非0则失败
EOF
echo $0 $1 $2 ${11}
echo "参数的个数为:" $#
echo "$/*" $*
echo "$/@" $@
==================================Shell中的数组
JAVA中的数组:
String[] fields={"a","b","c",....}
Shell中的数组:
数组名=(元素 元素 元素 元素 元素) 元素之间以空格分割,索引从0开始,自增
arr=(1 2 3 4 5 6 7)
根据索引读取数组元素:echo ${arr[0]}
获取数据组的长度:echo ${#arr[*]} | echo ${#arr[@]}
获取数组中所有的元素:echo ${arr[*]} | echo ${arr[@]}
修改数组:
(1)可以直接给变量重新赋值
(2)可以根据所有修改数组例如:arr[1]=c
for循环遍历数组
#!/bin/bash
myarray=(1 2 3 4 5 6 7 8 9)
for i in ${myarray[@]}
do
echo $i
done
================运算符
JAVA中的运算:
private int num1=6
private int num2=3
int result=num1/num2
Shell中的运算:
“$((运算式))”或“$[运算式]” + , - , *, /, % 加,减,乘,除,取余
echo $(($A/$B)) | echo $[$A/$B]
echo $(($A+$B)) | echo $[$A+$B]
echo $(($A-$B)) | echo $[$A-$B]
echo $(($A%$B)) | echo $[$A%$B]
echo $[(3+5)*$A]
expr + , - , \*, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
expr $A \* $B
expr `expr 3 + 5 ` \* $A
小数运算格式
echo $(echo "scale=1;5/2" | bc)
==========Shell中的条件判断
JAVA中的条件判断
private int num1=6
private int num2=3
if(num1>num2){
sout(.....)
}else{
sout(.....)
}
Shell中的条件判断
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ jinghang ]返回true,[] 返回false。
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
[ $A -lt $B ] :比较变量A是否小于变量B
(2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
[ -w test06.sh ] : 判断文件是否有可写权限
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
[ -f test04.sh ] :判断文件是否存在,并且是一个常规文件
多条件判断:多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
[root@Linux2 class22_shell]# [ -e test100.sh ] || echo "FALSE"
FALSE
[root@Linux2 class22_shell]# [ -e test04.sh ] && echo "TRUE"
TRUE
Shell重中之重点(流程控制)
JAVA if条件判断
private int num1=6
private int num2=3
if(num1>num2){
sout(.....)
}else{
sout(.....)
}
Shell中的条件判断
if [ 条件判断式 ]
then
主体代码
fi
------------------------
if [ 条件判断式 ]
then
主体代码
elif [条件判断式]
then
主体代码
else
主体代码
fi
------------------------------
if [ 条件判断式 ]
then
主体代码
else
主体代码
fi
---------------------
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
完成一个脚本,传入一个文件的名称,如果改文件是一个常规文件
(1)往这个常规文件中写入 bbbb
(2)如果不是常规文件,打印该文件不是常规文件
#!/bin/bash
if [ -f $1 ]
then
echo bbbb >> $1
else
echo "这个文件不是一个常规文件"
fi
完成一个脚本,传入两个参数,
判断参数大小,用大的减小的,
如果相等,则输出两个数值相同
#!/bin/bash
if [ $1 -gt $2 ]
then
echo $[$1-$2]
elif [ $1 -lt $2 ]
then
echo $[$2-$1]
else
echo "两个参数的数值相同"
fi
=======shell中case的使用
JAVA中的switch
int a = 111;
switch(a){
case 111:
.....;
break;
case 222:
.....;
break;
....
default:
.....;
break;
}
shell中case的使用
注意事项:
1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2)双分号“;;”表示命令序列结束,相当于java中的break。
3)最后的“*)”表示默认模式,相当于java中的default。
写一个脚本
如果传入的数字是2;打印2
如果传入的数字是3;打印3
如果传入的数字是4;打印4
其他的数字:打印"其他"
#!/bin/bash
case $1 in
1)
echo "1"
;;
2)
echo "2"
;;
3)
echo "3"
;;
*)
echo "其他"
;;
esac
=======for循环====================
JAVA中的for循环
for(i=0;i<100;i++){
}
for xxx in xxx{
}
Shell中的for循环
写法一
sum=0
for((i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
写法二
<<EOF
$*:读取传入脚本中的全部参数,把参数看作一个整体
$@:读取传入脚本中的全部参数,把参数区分对待
EOF
for i in "$*"
do
echo "$/*" $i
done
for j in "$@"
do
echo "$/@" $j
done
======while循环
JAVA中的while循环
while(i<100){
主体代码
}
Shell中的while循环
while [ 条件判断式 ]
do
程序
done
样例:
#!/bin/bash
<<EOF
while 循环完成1到100之间的所有基数的和
EOF
i=1
sum=0
while [ $i -le 100 ]
do
if [ $[$i%2] -ne 0 ]
then
sum=$[$sum+$i]
fi
i=$[$i+1]
done
echo $sum
流程控制:if case for while
=========read读取控制台输入的参数========
#!/bin/bash
read -t 5 -p "请输入一个数字" A
echo $A
#判断参数存不存在
if [ ! -n "$A" ]
then
echo "没有获取到参数"
else
i=1
sum=0
while [ $i -le $A ]
do
if [ $[$i%2] -ne 0 ]
then
sum=$[$sum+$i]
fi
i=$[$i+1]
done
echo $sum
fi
==========================函数===============
系统函数
basename作用:从文件的绝对路径中,获取文件的名称,可以去除文件的后缀
[root@Linux2 class22_shell]# basename /root/class22_shell/while12.sh
while12.sh
[root@Linux2 class22_shell]# basename /root/class22_shell/while12.sh .sh
while12
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
[root@Linux2 class22_shell]# dirname /root/class22_shell/while12.sh
/root/class22_shell
自定义函数
#!/bin/bash
<<EOF
使用Shell中的函数完成两个数字的累加
EOF
函数的创建
function print()
{
echo "hello word"
return 2
}
函数的创建
function add()
{
sum=0
sum=$[$1+$2]
echo $sum
}
read -t 5 -p "请输入第一个参数" arg1
read -t 5 -p "请输入第一个参数" arg2
函数的调用
add $arg1 $arg2
print
注意:调用函数时,直接写函数名完成调用,一定要注意,调用一定要在函数下
1.无参无返回值
2.无参数,有返回值 (返回值使用return,0~255之间)
3.有参,有返回值
4.有参,无返回值
================正则表达式======
单字符匹配
. 匹配除了换行符之外的任意字符
\d 匹配数字0~9 =>[0-9]
\D 匹配非数字 => [^0-9]
[a-z] 匹配字符a-z
\s 匹配空白字符
\S 表示匹配非空白字符
\w 表示匹配单词字符[a-zA-Z0-9_]
\W 表示匹配非单词字符
....
^ 表示匹配以...开头
$ 表示匹配以...结尾
多字符匹配(贪婪模式,尽可能多的匹配)
* :表示匹配*号前的字符(表达式)任意次(0~无限次)
+ :表示匹配*号前的字符(表达式)至少1次
?:表示匹配?号前的字符(表达式)0~1次
{n}: 表示匹配{n}号前的字符n次
{n,m}: 表示匹配{n,m}号前的字符n~m次
非贪婪模式(尽可能少的匹配)
*?
+?
??
其他
| 或
() 分组
1.用一句话概括Shell
Shell是一个解释器,介于应用程序(用户)和操作系统之间的一个桥梁,负责命令的解释
2.Shell的编程语言
编译型语言:
程序在执行之前需要个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依养编译器,跨平台性差些。如C、C++、java
解释型语言:
程序不需要编译,程序在运行时由解释器翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/javaScript/Shell等都是解释型语言。
Shell的解析器:
/bin/sh 是bash的一个快捷方式
/bin/bash(最多) bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能
/sbin/nologin 表示非交互,不能登录操作系统
/bin/dash 小巧,高效,功能相比少一些
/bin/tcsh 具有C语言风格的一种shell,具有许多特性,但是也有一些缺陷
/bin/csh 是csh的增强版本,完全兼容csh
[ljh@Linux2 ~]$ ll /bin | grep bash
-rwxr-xr-x. 1 root root 942200 3月 23 2017 bash
lrwxrwxrwx. 1 root root 4 2月 3 23:07 sh -> bash
Shell编程语言目的:
写脚本
学习Shell语言的方法:
最简单的语言、技巧(多看、多读、借鉴、思考)
使用场景:
完成自动化的工作:自动化部署、自动化的分析等 ( 自动化运维 )
什么是脚本?
脚本就是将需要执行的命令保存到文本中,按照顺序执行(由上往下执行),它是解释型的,不需要编译。
布置一个简单的任务:(执行mkdir -p class22/test)
1.删除class22中的test文件夹
2.在class22文件夹中新建一个test2 文件夹,在test2中新建dir1、dir2、dir3三个子目录
3.在dir2中新建一个class22.txt文件,
4.往class22.txt文件中写入libai
5.打印一句话"任务执行完毕 2020-2-12 10:24"
写一个脚本
step1在第一行(指明解析器):#!/bin/bash 或者 #!/bin/env bash
step2添加描述信息:(脚本名称、路径、描述、创建时间、修改时间、编辑人)
step3编写脚本主体代码
#!/bin/bash
#NAME:test03.sh
#DESC:第一个脚本任务
#CREATETIME:2020-2-12 10:44
#CREATE:wangwu
#PATH:/root/class22_shell
<<EOF
asnckas
jsacbsal
EOF
<<!
a KD
asc las
!
#1.删除class22中的test文件夹
rm -rf /root/class22_shell/class22/test
#2.在class22文件夹中新建一个test2 文件夹,在test2中新建dir1、dir2、dir3三个子目录
mkdir -p /root/class22_shell/class22/test2/dir{1..3}
#3.在dir2中新建一个class22.txt文件
touch /root/class22_shell/class22/test2/dir2/class22.txt
#4.往class22.txt文件中写入libai
echo libai >> /root/class22_shell/class22/test2/dir2/class22.txt
#5.打印一句话"任务执行完毕 2020-2-12 10:24"
echo "任务执行完毕 `date "+%Y-%m-%d %H:%M:%S"`"
step4:执行脚本
执行方式一:
sh/bash 绝对路径|相对路径
source 绝对路径|相对路径
执行方式二:(注意脚本中的指定的解析器一定不要写错)
推荐的执行方式:给脚本添加执行权限
chmod +x 脚本名称
执行:./脚本名称
如果需要在任意地方执行脚本,需要将脚本移动至/bin目录
执行:脚本名称
扩展命令
bash -n test03.sh 检查脚本语法错误
bash -x test03.sh 查看脚本的执行流程(步骤)
Shell中的变量
JAVA中的变量:
修饰符 类型 变量名称
private string name="张三";
1.系统变量
$HOME、$PWD、$SHELL、$USER等
2.自定义变量(shell中的变量没有明显的数据类型区分)
普通变量
定义变量:变量名=值 (注意:1.等号两边不要出现空格 2.变量名称不要有特殊字符 3.变量名称不能以数字和特殊字符开头)
读取变量:echo $变量名
撤销变量:unset 变量名
静态变量(一旦创建,只可读): readonly 变量名=值
变量的作用域(只在当前会话和当前用户下有效)
全局环境变量(export)
定义变量:export 变量名=值
全局环境变量的作用域(只在当前会话下的所有用户有效)
系统环境变量
vim /etc/profile
#系统环境变量
export CLASS22=ljh
一定要激活:source /etc/profile
系统环境变量的作用域(针对于所有会话下的所有用户都有效)
查看所有变量
使用set命令
特殊的变量
#!/bin/bash
<<EOF
特殊变量介绍和使用
$n 功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$#:获取所有输入参数个数,常用于循环
$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$?:表示读取命令的直接结果状态,返回的变量值为0,说明执行成功,非0则失败
EOF
echo $0 $1 $2 ${11}
echo "参数的个数为:" $#
echo "$/*" $*
echo "$/@" $@
==================================Shell中的数组
JAVA中的数组:
String[] fields={"a","b","c",....}
Shell中的数组:
数组名=(元素 元素 元素 元素 元素) 元素之间以空格分割,索引从0开始,自增
arr=(1 2 3 4 5 6 7)
根据索引读取数组元素:echo ${arr[0]}
获取数据组的长度:echo ${#arr[*]} | echo ${#arr[@]}
获取数组中所有的元素:echo ${arr[*]} | echo ${arr[@]}
修改数组:
(1)可以直接给变量重新赋值
(2)可以根据所有修改数组例如:arr[1]=c
for循环遍历数组
#!/bin/bash
myarray=(1 2 3 4 5 6 7 8 9)
for i in ${myarray[@]}
do
echo $i
done
================运算符
JAVA中的运算:
private int num1=6
private int num2=3
int result=num1/num2
Shell中的运算:
“$((运算式))”或“$[运算式]” + , - , *, /, % 加,减,乘,除,取余
echo $(($A/$B)) | echo $[$A/$B]
echo $(($A+$B)) | echo $[$A+$B]
echo $(($A-$B)) | echo $[$A-$B]
echo $(($A%$B)) | echo $[$A%$B]
echo $[(3+5)*$A]
expr + , - , \*, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
expr $A \* $B
expr `expr 3 + 5 ` \* $A
小数运算格式
echo $(echo "scale=1;5/2" | bc)
==========Shell中的条件判断
JAVA中的条件判断
private int num1=6
private int num2=3
if(num1>num2){
sout(.....)
}else{
sout(.....)
}
Shell中的条件判断
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ jinghang ]返回true,[] 返回false。
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
[ $A -lt $B ] :比较变量A是否小于变量B
(2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
[ -w test06.sh ] : 判断文件是否有可写权限
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
[ -f test04.sh ] :判断文件是否存在,并且是一个常规文件
多条件判断:多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
[root@Linux2 class22_shell]# [ -e test100.sh ] || echo "FALSE"
FALSE
[root@Linux2 class22_shell]# [ -e test04.sh ] && echo "TRUE"
TRUE
Shell重中之重点(流程控制)
JAVA if条件判断
private int num1=6
private int num2=3
if(num1>num2){
sout(.....)
}else{
sout(.....)
}
Shell中的条件判断
if [ 条件判断式 ]
then
主体代码
fi
------------------------
if [ 条件判断式 ]
then
主体代码
elif [条件判断式]
then
主体代码
else
主体代码
fi
------------------------------
if [ 条件判断式 ]
then
主体代码
else
主体代码
fi
---------------------
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
完成一个脚本,传入一个文件的名称,如果改文件是一个常规文件
(1)往这个常规文件中写入 bbbb
(2)如果不是常规文件,打印该文件不是常规文件
#!/bin/bash
if [ -f $1 ]
then
echo bbbb >> $1
else
echo "这个文件不是一个常规文件"
fi
完成一个脚本,传入两个参数,
判断参数大小,用大的减小的,
如果相等,则输出两个数值相同
#!/bin/bash
if [ $1 -gt $2 ]
then
echo $[$1-$2]
elif [ $1 -lt $2 ]
then
echo $[$2-$1]
else
echo "两个参数的数值相同"
fi
=======shell中case的使用
JAVA中的switch
int a = 111;
switch(a){
case 111:
.....;
break;
case 222:
.....;
break;
....
default:
.....;
break;
}
shell中case的使用
注意事项:
1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2)双分号“;;”表示命令序列结束,相当于java中的break。
3)最后的“*)”表示默认模式,相当于java中的default。
写一个脚本
如果传入的数字是2;打印2
如果传入的数字是3;打印3
如果传入的数字是4;打印4
其他的数字:打印"其他"
#!/bin/bash
case $1 in
1)
echo "1"
;;
2)
echo "2"
;;
3)
echo "3"
;;
*)
echo "其他"
;;
esac
=======for循环====================
JAVA中的for循环
for(i=0;i<100;i++){
}
for xxx in xxx{
}
Shell中的for循环
写法一
sum=0
for((i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
写法二
<<EOF
$*:读取传入脚本中的全部参数,把参数看作一个整体
$@:读取传入脚本中的全部参数,把参数区分对待
EOF
for i in "$*"
do
echo "$/*" $i
done
for j in "$@"
do
echo "$/@" $j
done
======while循环
JAVA中的while循环
while(i<100){
主体代码
}
Shell中的while循环
while [ 条件判断式 ]
do
程序
done
样例:
#!/bin/bash
<<EOF
while 循环完成1到100之间的所有基数的和
EOF
i=1
sum=0
while [ $i -le 100 ]
do
if [ $[$i%2] -ne 0 ]
then
sum=$[$sum+$i]
fi
i=$[$i+1]
done
echo $sum
流程控制:if case for while
=========read读取控制台输入的参数========
#!/bin/bash
read -t 5 -p "请输入一个数字" A
echo $A
#判断参数存不存在
if [ ! -n "$A" ]
then
echo "没有获取到参数"
else
i=1
sum=0
while [ $i -le $A ]
do
if [ $[$i%2] -ne 0 ]
then
sum=$[$sum+$i]
fi
i=$[$i+1]
done
echo $sum
fi
==========================函数===============
系统函数
basename作用:从文件的绝对路径中,获取文件的名称,可以去除文件的后缀
[root@Linux2 class22_shell]# basename /root/class22_shell/while12.sh
while12.sh
[root@Linux2 class22_shell]# basename /root/class22_shell/while12.sh .sh
while12
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
[root@Linux2 class22_shell]# dirname /root/class22_shell/while12.sh
/root/class22_shell
自定义函数
#!/bin/bash
<<EOF
使用Shell中的函数完成两个数字的累加
EOF
函数的创建
function print()
{
echo "hello word"
return 2
}
函数的创建
function add()
{
sum=0
sum=$[$1+$2]
echo $sum
}
read -t 5 -p "请输入第一个参数" arg1
read -t 5 -p "请输入第一个参数" arg2
函数的调用
add $arg1 $arg2
print
注意:调用函数时,直接写函数名完成调用,一定要注意,调用一定要在函数下
1.无参无返回值
2.无参数,有返回值 (返回值使用return,0~255之间)
3.有参,有返回值
4.有参,无返回值
================正则表达式======
单字符匹配
. 匹配除了换行符之外的任意字符
\d 匹配数字0~9 =>[0-9]
\D 匹配非数字 => [^0-9]
[a-z] 匹配字符a-z
\s 匹配空白字符
\S 表示匹配非空白字符
\w 表示匹配单词字符[a-zA-Z0-9_]
\W 表示匹配非单词字符
....
^ 表示匹配以...开头
$ 表示匹配以...结尾
多字符匹配(贪婪模式,尽可能多的匹配)
* :表示匹配*号前的字符(表达式)任意次(0~无限次)
+ :表示匹配*号前的字符(表达式)至少1次
?:表示匹配?号前的字符(表达式)0~1次
{n}: 表示匹配{n}号前的字符n次
{n,m}: 表示匹配{n,m}号前的字符n~m次
非贪婪模式(尽可能少的匹配)
*?
+?
??
其他
| 或
() 分组
shall 2-13的更多相关文章
- TechEmpower 13轮测试中的ASP.NET Core性能测试
应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关搜索引擎的降级处罚.在选择框架时, ...
- .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...
- 转:ORA-15186: ASMLIB error function = [asm_open], error = [1], 2009-05-24 13:57:38
转:ORA-15186: ASMLIB error function = [asm_open], error = [1], 2009-05-24 13:57:38http://space.itpub. ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)
CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection) 2016-08-13 由于CSh ...
- ABP(现代ASP.NET样板开发框架)系列之13、ABP领域层——数据过滤器(Data filters)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之13.ABP领域层——数据过滤器(Data filters) ABP是“ASP.NET Boilerplate P ...
- 推荐13款javascript模板引擎
javaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎.(排名不分先后顺序) 1. Mustache 基于j ...
- ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态
原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...
- C#开发微信门户及应用(13)-使用地理位置扩展相关应用
本文继续上一篇<C#开发微信门户及应用(12)-使用语音处理>,继续介绍微信的相关应用.我们知道,地理位置信息可以用来做很多相关的应用,除了我们可以知道用户所在的位置,还可以关联出一些地理 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
随机推荐
- Java实现蓝桥杯VIP 算法训练 P0504
试题 算法训练 P0504 资源限制 时间限制:1.0s 内存限制:256.0MB Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的 ...
- Java实现 LeetCode 230 二叉搜索树中第K小的元素
230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. ...
- Java实现 蓝桥杯VIP 算法训练 P0504
算法训练 P0504 时间限制:1.0s 内存限制:256.0MB Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,Uncl ...
- Java实现 LeetCode 55 跳跃游戏
55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] ...
- java实现第六届蓝桥杯移动距离
移动距离 题目描述 X星球居民小区的楼房全是一样的,并且按矩阵样式排列.其楼房的编号为1,2,3- 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 ...
- Python基础语法之“print()”函数
print()函数是Python入门的第一个必学知识点,它经常被用来调试已写的代码,检验效果,今天小老鼠就带你盘点一下print()函数在Python中如何使用. print()函数的工作流程是这样的 ...
- 曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?
如何计算,一对key/value应该放在哪个哈希桶 大家都知道,hashmap底层是数组+链表(不讨论红黑树的情况),其中,这个数组,我们一般叫做哈希桶,大家如果去看jdk的源码,会发现里面有一些变量 ...
- 滴滴数据驱动利器:AB实验之分组提效
桔妹导读:在各大互联网公司都提倡数据驱动的今天,AB实验是我们进行决策分析的一个重要利器.一次实验过程会包含多个环节,今天主要给大家分享滴滴实验平台在分组环节推出的一种提升分组均匀性的新方法.本文首先 ...
- Android下的缓存策略
Android下的缓存策略 内存缓存 常用的内存缓存是软引用和弱引用,大部分的使用方式是Android提供的LRUCache缓存策略,本质是个LinkedHashMap(会根据使用次数进行排序) 磁盘 ...
- Say Something About Of Flash Android
Why am I need say something about of flash android? It's at my college life when I touch flash andro ...