一、Shell介绍
- Shell 既是
应用程序
又是一种脚本语言
。 - 站在连接外围应用层与操作系统内核的角度:Shell 是一个命令行解释器,它接收应用程序 / 用户命令,然后调用操作系统内核。
- 站在使用Shell进行编程的角度:它还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。编写出
Shell脚本
。
Shell脚本
shell脚本 本质上是 linux 命令,一条一条命令根据逻辑按照Shell编程的语法规则组合在一起,实现某一个目的,就变成了shell脚本。它从一定程度上 减轻了工作量,提高了工作效率。
二、脚本入门
1 格式
脚本文件第一行为:#!/bin/bash 或 #!/bin/sh 等。作用为指定Shell解释器
脚本命名:一般以.sh
结尾。也可省略。
2 执行
第一种方式
:在子shell窗口执行,由命令解释器执行,不需要赋予脚本执行权限- bash 脚本相对路劲或绝对路径
- sh 脚本相对路劲或绝对路径
第二种方式
:在子shell窗口执行,由当前用户执行,脚本需要可执行权限- 脚本相对路劲或绝对路径。
第三种方式
:在当前shell窗口执行。不需要赋予脚本执行权限- . 脚本相对路劲或绝对路径
- source 脚本相对路劲或绝对路径
第四种方式
:需要将脚本添加到全局系统变量 PATH 中的特定路径下。- 使用脚本文件名直接执行
注意
:在当前shell窗口执行和子shell窗口执行的区别在于:变量的作用域
三、变量
1 分类
第一种
:
- 全局变量:子shell可见,子shell修改对父shell无效。
- 局部变量:只对当前shell有效。
第二种
:
- 系统变量:系统定义好的变量。$HOME,$PWD,$SHELL,$USER,$PATH。
- 用户变量:用户自定义的变量。
2 查看
- 打印指定的变量:echo $***
- 打印所有系统全局变量:env 、 printenv
- 打印指定的系统全局变量:printenv ***
- 打印所有变量:set
3 自定义
- 定义(用户、局部):变量名=变量值。注意,变量值由
空格组成
时需用双引号
括起来 - 撤销:unset 变量名
- 只读:readonly 变量名。
不能
撤销
和重写赋值
。 - 提升:export 变量名
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
4 特殊变量
- $n
- $0:调用Shell程序执行脚本时,Shell 程序后面所加的脚本路劲。如 sh /root/桌面/demo,脚本中$0表示 /root/桌面/demo。
- $1:第一个参数,以此类推。
注意
,10以上表示为 ${n}。
- $*:所有参数的集合。
- $@:所有参数的集合。
- $#:所有参数个数。
注意
:$*与$@区别在于使用for遍历"$*“时,只循环一次,值为所有参数集合。而使用for遍历”$@"时,循环次数为参数个数,值为对应的每个参数的值。
5 实操案例
[root@demo01 桌面]# cat demo1
#!/bin/bash
echo '===============$n================='
echo $0
echo $1
echo $2
echo '===============$#================='
echo $#
echo '===============$*================='
echo $*
echo '===============$@================='
echo $@
[root@demo01 桌面]# sh demo1 1 2 3
===============$n=================
demo1
1
2
===============$#=================
3
===============$*=================
1 2 3
===============$@=================
1 2 3
[root@demo01 桌面]#
四、运算符表达式
-
基本语法:expr 1 + 2,执行输出3
-
简写语法:$((运算式)) 或 $[运算式]
-
示例
expr 1 + 2 输出3 a=$(expr 1 + 2) $a=3 命令替换 a=`expr 1 + 2` $a=3 命令替换 echo $[1+2] 输出3 echo $((1+2)) 输出3 a=$[1+2] $a=3
五、条件表达式
-
基本语法:test condition --> 取返回值:$?
-
简写:
[ condition ](注意 condition 前后要有空格)
。注意:条件非空即为 true,[ haha ]返回 true,[ ] 返回 false -
示例:字符串之间用“=”判断相等,用“!=”判断不等
[root@demo01 桌面]# a=hello
[root@demo01 桌面]# [ $a = hello ]
[root@demo01 桌面]# echo $?
0
[root@demo01 桌面]# [ $a=Hello ]
[root@demo01 桌面]# echo $?
0
[root@demo01 桌面]#
-
逻辑运算符
(1)两个整数之间比较 -eq 等于(equal) -ne 不等于(not equal) -lt 小于(less than) -le 小于等于(less equal) -gt 大于(greater than) -ge 大于等于(greater equal) (2)按照文件权限进行判断 -r 有读的权限(read) -w 有写的权限(write) -x 有执行的权限(execute) (3)按照文件类型进行判断 -e 文件存在(existence) -f 文件存在并且是一个常规的文件(file) -d 文件存在并且是一个目录(directory) (4)是否为空 -z
-
多条件判断
[ atguigu ] && echo OK || echo notOK [ condition -a condition ] 逻辑与and [ condition -o condition ] 逻辑或or
六、if
1 语法
- 单分支(注意:使用“;”可以代替换行)
if [ 条件判断式 ]
then 程序
fi
- 多分支
if [ 条件判断式 ]
then 程序
elif [ 条件判断式 ]
then 程序
else
程序
fi
2 实操案例
[root@demo01 桌面]# cat demo2
#!/bin/sh
echo "====================根据第一个参数判断逻辑(if elif else fi)==================="
if [ "$1" = "1" ]
then
echo "我真帅!"
elif [ "$1" = "2" ]
then
echo "我真美!"
elif [ -z $1 ]
then
echo "参数为空!"
else
echo "其他参数逻辑!"
fi
echo "====================根据第一个参数判断逻辑(case in esac)==================="
case $1 in
"1")
echo "我真帅!" ;;
"2")
echo "我真美!" ;;
"")
echo "参数不存在!" ;;
*)
echo "其他参数逻辑!" ;;
esac
[root@demo01 桌面]# sh demo2 1
====================根据第一个参数判断逻辑(if elif else fi)===================
我真帅!
====================根据第一个参数判断逻辑(case in esac)===================
我真帅!
[root@demo01 桌面]# sh demo2 2
====================根据第一个参数判断逻辑(if elif else fi)===================
我真美!
====================根据第一个参数判断逻辑(case in esac)===================
我真美!
[root@demo01 桌面]# sh demo2 3
====================根据第一个参数判断逻辑(if elif else fi)===================
其他参数逻辑!
====================根据第一个参数判断逻辑(case in esac)===================
其他参数逻辑!
[root@demo01 桌面]# sh demo2
====================根据第一个参数判断逻辑(if elif else fi)===================
参数为空!
====================根据第一个参数判断逻辑(case in esac)===================
参数不存在!
[root@demo01 桌面]#
七、case
1 语法
case $变量名 in
"值1")
如果变量的值等于值 1,则执行程序 1
;;
"值2")
如果变量的值等于值 2,则执行程序 2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
2 案例实操
[root@demo01 桌面]# cat demo2
#!/bin/sh
echo "====================根据第一个参数判断逻辑(if elif else fi)==================="
if [ "$1" = "1" ]
then
echo "我真帅!"
elif [ "$1" = "2" ]
then
echo "我真美!"
elif [ -z $1 ]
then
echo "参数为空!"
else
echo "其他参数逻辑!"
fi
echo "====================根据第一个参数判断逻辑(case in esac)==================="
case $1 in
"1")
echo "我真帅!" ;;
"2")
echo "我真美!" ;;
"")
echo "参数不存在!" ;;
*)
echo "其他参数逻辑!" ;;
esac
[root@demo01 桌面]# sh demo2 1
====================根据第一个参数判断逻辑(if elif else fi)===================
我真帅!
====================根据第一个参数判断逻辑(case in esac)===================
我真帅!
[root@demo01 桌面]# sh demo2 2
====================根据第一个参数判断逻辑(if elif else fi)===================
我真美!
====================根据第一个参数判断逻辑(case in esac)===================
我真美!
[root@demo01 桌面]# sh demo2 3
====================根据第一个参数判断逻辑(if elif else fi)===================
其他参数逻辑!
====================根据第一个参数判断逻辑(case in esac)===================
其他参数逻辑!
[root@demo01 桌面]# sh demo2
====================根据第一个参数判断逻辑(if elif else fi)===================
参数为空!
====================根据第一个参数判断逻辑(case in esac)===================
参数不存在!
[root@demo01 桌面]#
八、for
1 语法
-
基本语法
for(( 初始值;循环控制条件;变量变化)) do 程序 done
for i in 值1 值2 值3 注意:也可 for i in {1..100} do 程序 done
2 案例实操
[root@demo01 桌面]# cat demo3
#!/bin/bash
echo "============1)打印所有参数=================="
for item in "$@"
do
echo $item
done
echo '============2)比较$*和$@的区别=============='
echo '===================$*======================='
for item in "$*"
do
echo $item
done
echo '==================$@========================'
for item in "$@"
do
echo $item
done
echo "===========3)fori语法计算1到100的和========="
a=0
for ((i=1;i<=100;i++))
do
a=$(($a+$i))
done
echo "1到100相加的和为:$a"
echo "==============4)while语法:从1加到100==========="
a=1
sum=0
while [ $a -le 100 ]
do
sum=$(($sum+$a))
a=$(($a+1))
done
echo "1到100的和为:$sum"
[root@demo01 桌面]# sh demo3 1 2 3
============1)打印所有参数==================
1
2
3
============2)比较$*和$@的区别==============
===================$*=======================
1 2 3
==================$@========================
1
2
3
===========3)fori语法计算1到100的和=========
1到100相加的和为:5050
==============4)while语法:从1加到100===========
1到100的和为:5050
[root@demo01 桌面]#
九、while
1 语法
-
基本语法
while [ 条件判断式 ] do 程序 done
2 案例实操
[root@demo01 桌面]# cat demo3
#!/bin/bash
echo "============1)打印所有参数=================="
for item in "$@"
do
echo $item
done
echo '============2)比较$*和$@的区别=============='
echo '===================$*======================='
for item in "$*"
do
echo $item
done
echo '==================$@========================'
for item in "$@"
do
echo $item
done
echo "===========3)fori语法计算1到100的和========="
a=0
for ((i=1;i<=100;i++))
do
a=$(($a+$i))
done
echo "1到100相加的和为:$a"
echo "==============4)while语法:从1加到100==========="
a=1
sum=0
while [ $a -le 100 ]
do
sum=$(($sum+$a))
a=$(($a+1))
done
echo "1到100的和为:$sum"
[root@demo01 桌面]# sh demo3 1 2 3
============1)打印所有参数==================
1
2
3
============2)比较$*和$@的区别==============
===================$*=======================
1 2 3
==================$@========================
1
2
3
===========3)fori语法计算1到100的和=========
1到100相加的和为:5050
==============4)while语法:从1加到100===========
1到100的和为:5050
[root@demo01 桌面]#
十、函数
1 介绍
含义:一个简化、灵活、缩小版的脚本。命令、脚本是函数的集合。
分类:
内置命令:
外部命令:通常称之为工具
2 系统函数
date +%y%m%d
- 基本使用(脚本中调用需要命令替换):$(date)
basename [string / pathname] [suffix]
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
- 基本使用(脚本中调用需要命令替换):$(basename)
dirname 文件路径:去除 “/文件名” 后的路径
dirname :当前绝对路径
- 基本使用(脚本中调用需要命令替换):$(dirname)
3 自定义函数
(1)基本语法
function funname()
{
Action;
[return int;]
}
- 函数返回值,只能通过$?系统变量获得
- 可以用:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
- return 后跟数值 n(0-255)
4 案例实操
[root@demo01 桌面]# cat demo4
#!/bin/bash
echo "========计算两个输入参数的和:自定义方法+控制台输入read==========";
function sum(){
echo "计算两个参数的和"
read -t 60 -p "请输入第一个参数:" AAA
if [ -z $AAA ]
then
echo "超时未输入参数,退出!"
return -1
fi
read -t 60 -p "请输入第二个参数:" BBB
if [ -z $BBB ]
then
echo "超时未输入参数,推出!"
return -1
fi
SUM=$(($AAA+$BBB))
echo "两数之和为:$SUM"
return 0
}
sum;
[root@demo01 桌面]# sh demo4
========计算两个输入参数的和:自定义方法+控制台输入read==========
计算两个参数的和
请输入第一个参数:15156
请输入第二个参数:5161
两数之和为:20317
[root@demo01 桌面]#