shell概念
shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核。shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。
子shell中设置的当前变量,父shell是不可见的。
变量
1.系统预定义变量
$HOME $PWD $SHELL $USER;echo $HOME;set查看当前shell中的变量;env查看系统环境变量
2.自定义变量
定义变量:变量名=变量值,注意=前后不能有空格
撤销变量:unset 变量名
声明静态变量:readonly 变量,注意:不能unset
export 变量名:提升(父shell)中的变量为全局变量
3.特殊变量
0代表该脚本名称,9代表第一到第九个参数,十以上的参数需用大括号包含如,${10}
$#:获取输入参数的个数,常常用于循环,判断参数的个数是否正确以及加强脚本的健壮性
$*:代表命令行中所有的参数,把所有参数看成一个整体
$@:代表命令行中所有的参数,把每个参数区分对待
$?:最后一次执行命令的返回状态。如果这个变量为0,证明上一 个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明 上一个命令执行不正确了。
运算符
[运算式]
条件判断
test condition
[ condition ](注意 condition 前后要有空格)
注意:条件非空即为 true,[ mld ]返回 true,[ ] 返回 false。
(1)两个整数之间比较
-eq 等于(equal)
-ne 不等于(not equal)
-lt 小于(less than)
-le 小于等于(less equal)
-gt 大于(greater than)
-ge 大于等于(greater equal)
注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。
eg:[ 2 -eq 2]
(2)按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
eg: [ -r hello.sh ]
(3)按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)
eg:[-e hello.sh]
eg: [ a -lt 35 ]等价于 [ a -gt 18 ]&&[ a -lt 35 ]
流程控制
1.if判断
if [ 条件表达式 ];then
程序
fi
if [ 条件表达式 ]
then
程序
fi
if [ 条件表达式 ]
then
程序
elif [ 条件表达式 ]
then
程序
else
程序
fi
2.case语句
case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
3.for循环
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
for 变量 in 值 1 值 2 值 3…
do
程序
done
4.while循环
while [ 条件判断式 ]
do
程序
done
读取控制台输入
read (选项) (参数)
①选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待
②参数
变量:指定读取值的变量名
函数
1.系统函数
basename:basename [string / pathname] [suffix] (功能描述:basename 命令会删掉所有的前 缀包括最后一个(‘/’)字符,然后将字符串显示出来。 basename 可以理解为取路径里的文件名称 。选项: suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
basename /root/scripts/
scripts
basename /root/scripts/ s
script
surname:dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名 (非目录的部分),然后返回剩下的路径(目录的部分)) dirname 可以理解为取文件路径的绝对路径名称
dirname /home/scripts/banzhang.txt
/home/scripts
命令替换 eg $( pwd )获取命令执行后的值
2.自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
#!/bin/bash
function add(){
res=$[$1+$2]
echo $res;
return $res;
}
read -p "1" a
read -p "2" b
add $a $b
必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一 样先编译。
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将 以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
综合案例
#!/bin/bash
#首先判断输入参数个数是否1
if [ $# -ne 1 ]
then
echo "参数错误"
exit
fi
#获取当前目录名称
if [ -d $1 ]
then
echo
else
echo
echo "目录不存在"
echo
exit
fi
DIR_NAME=$( basename $1)
DIR_PATH=$( cd $(dirname $1);pwd )
DATE=$( date +%y%m%d)
FILE=archive_${DIR_NAME}_${DATE}.tar.gz
DEST=/root/archive/$FILE
echo "归档"
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档成功"
echo "归档文件为:" $DIR_PATH/$DIR_NAME
echo "归档地址为:" $DEST
else
echo "error"
fi
exit
#每天凌晨两点定时调用这个shell脚本
0 2 * * * /root/scripts/daily_archive.sh /root/scripts