一、shell概述
shell是一个命令解释器,它接收应用程序/用户命令,然后调用操作系统内核
shell脚本:命令程序语句不在命令行下执行,而是通过一个程序文件执行。
简单、易用、高效
Linux 提供的 Shell 解析器有
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
Centos Linux系统默认的Shell是(bash)
脚本以#!/bin/bash 开头(指定解析器)
第一个shell脚本
#!/bin/bash
echo "hello world"
脚本的常用执行方式
第一种:采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)
sh+脚本的相对路径
sh ./xx.sh
sh+脚本的绝对路径
sh /home/xx.sh
bash+脚本的相对路径
bash ./xx.sh
bash+脚本的绝对路径
bash /home/xx.sh
第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
①首先要赋予 xx.sh 脚本的+x 权限
chmod +x xx.sh
②执行脚本
相对路径
./xx.sh
绝对路径
/home/xx.sh
第三种:在脚本的路径前加上“.”或者 source
①有以下脚本
[nawang@web home]$ cat test.sh
\#!/bin/bash
A=5
echo $A
②分别使用 sh,bash,./ 和 . 的方式来执行,结果如下:
[nawang@web home]$ bash test.sh
[nawang@web home]$ echo $A
[nawang@web home]$ sh test.sh
[nawang@web home]$ echo $A
[nawang@web home]$ ./test.sh
[nawang@web home]$ echo $A
[nawang@web home]$ . test.sh
[nawang@web home]$ echo $A
5
当前命令行就是个shell------父shell
在命令行里执行shell 相当于正在执行的是个子shell
儿子shell脚本会直接继承父亲shell脚本的变量、函数等,反之不可以。
如果希望反过来继承,就要用source或者点号在夫shell脚本中事先加载儿子shell脚本
使用sh执行会开启一个子shell
二、变量
变量可分为两类:
环境变量(全局变量)
1)内置环境变量:
满足系统需要,自身存在的变量,大写,所有的用户下都生效。
常用系统变量
$HOME $PWD $SHELL $USER等
显示当前 Shell 中所有变量:set
2)自定义环境变量
定义方法1:
export OLDBOY=1
定义方法2:
OLDBOY=2
export OLDBOY
定义方法3:
declare -x OLDBOY=3
以上均为临时生效
3)环境变量永久生效
/etc/profile
~/.bash_profile
~/.bashrc
/etc/bashrc
以上四个文件有优先顺序(倒序)
环境变量知识总结:
- 环境变量的取消:unset 变量名
- 输出环境变量可用“$变量名”
- 执行env默认可以显示环境变量名称及对应值
- 书写crond定时任务时要注意,脚本中用到的环境变量最好在执行的shell脚本中重新定义
- 如果希望环境变量永久生效可以放在用户环境变量文件或者全局环境变量文件里。
普通变量定义
普通变量的定义赋值 有以下三种写法:
变量名=value #<==赋值时不加引号
变量名='value' #<==赋值时加单引号
变量名="value" #<==赋值时加双引号
shell特殊重要变量
$0 获取当前执行的shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径
$n 获取当前执行shell脚本的第n个参数值(如果n大于9要用大括号括起来)
$# 获取当前执行的shell脚本后面接的参数总个数
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
Shell进程特殊状态变量
$? 获取执行上一个指令的执行状态返回值(0为成功,非零为失败)
$$ 获取当前执行的shell脚本的进程号(PID)
$! 获取上一个在后台工作的进程的进程号(PID)
$_ 获取在此之前执行的命令或脚本的最后一个参数
Shell变量子串
匹配删除的小结:
- #表示从开头删除匹配最短。
- ##表示从开头删除匹配最长。
- %表示从结尾删除匹配最短。
- %%表示从结尾删除匹配最长。
- a**c表示匹配的字符串,表示匹配所有,ac匹配开头为a、中间为任意多个字符、结尾为c的字符串。*
- a**C表示匹配的字符串,表示匹配所有,aC匹配开头为a、中间为任意多个字符、结尾为C的字符串。
shell特殊扩展变量介绍
三、运算符
基本语法
“$((运算式))” 或 “$[运算式]”
eg: 计算(1+1)*5的值
[nawang@web home]$ a=$[ (1+1)*5 ]
[nawang@web home]$ echo $a
四、条件判断
基本语法
test condition
[ condition ](注意 condition 前后要有空格)
注意:条件非空即为 true,[ atguigu ]返回 true,[ ] 返回 false。
常用判断条件
(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)
五、流程控制(重点)
if 判断
基本语法
单分支
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
多分支
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意:
①[ 条件判断式 ],中括号和条件判断式之间必须有空格
②if 后要有空格
case 语句
基本语法
case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
(1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
(2)双分号“;;”表示命令序列结束,相当于 java 中的 break。
(3)最后的“*)”表示默认模式,相当于 java 中的 default。
for 循环
基本语法 1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
实例一:从1加到100
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
基本语法 2
for 变量 in 值 1 值 2 值 3…
do
程序
done
实例:从 1 加到 100
#!/bin/bash
for i in {1..100}
do
sum=$[$sum+$i]
done
echo $sum
while 循环
基本语法
while [ 条件判断式 ]
do
程序
done
实例:从 1 加到 100
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum