一、Shell脚本
(一)shell脚本简介
1.shell:命令的有序集合。是一个解释型的语言。
2.shell脚本的创建步骤:
- 创建:闯将一个.sh文件
- 给文件赋予执行权限:chmod 755 文件名
- 编辑脚本:vim 文件名
- 执行脚本:./脚本文件
3.shell变量:shell没有数据类型,所有数据均视为字符串。
#变量定义
#用户自定义变量
变量名=值
#变量引用:本质是一个字符串替换
$变量名
#位置变量和预定义变量:是系统定义好的一些变量,可以直接使用,代表一些特定的值
#位置变量
#$n:命令行的第n个参数
#预定义变量:$@、$*——表示命令行的所有参数,$#——命令行所有参数的个数,$?——存储一个命令执行的结果,0表示执行成功,1表示执行失败,$$存储当前脚本的运行ID。
#环境变量:是由操作系统预定义的一些由终端或用户系统其他情况而决定值的变量。
#$PWD、$USER
(二)shell程序和语句
(1)功能性语句
- echo:输出
- read:输入。
- 使用方法:read 变量名1 变量名2 …… 变量名n
- 输入一空格分隔,以单词为单位放入对应变量中;若单词数多余变量数,则最后一个变量赋值为剩下的所有单词;若单词数少于变量数,则其他变量赋值空“”。
- expr:算术运算命令
- 使用方法:expr 表达式(变量 运算符(+、-、\*、\、%) 值等之间必须有一个空格)
- 将运算的结果赋值给变量:变量名=`expr 表达式`
- test:测试语句。一般不单独使用,常与if结合。shell中测试真假,可以对3种对象进行操作:字符串、整数、文件属性。
- 字符串测试:
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1字符串的长度是否为0
-n s1 测试s1字符串的长度是否不为0
- 整数测试:
a -eq b 测试a与b是否相等
a -ne b 测试a与b是否不相等
a - gt b 测试a是否大于b
a -ge b 测试a是否大于等于b
a -lt b 测试a是否小于b
a -le b 测试a是否小于等于b
- 文件属性测试
-d name 测试name是否为一个目录
-e name 测试一个文件是否存在
-f name 测试name是否为普通文件
-L name 测试name是否为符号链接
-r name 测试name文件是否存在且为可读
-w name 测试name文件是否存在且为可写
-x name 测试name文件是否存在且为可执行
-s name 测试name文件是否存在且其长度不为0
f1 -nt f2 测试文件f1是否比文件f2更新
f1 -ot f2 测试文件f1是否比文件f2更旧
(3)结构性语句
- if分支结构:
- 结构:
if [测试表达式]
then
语句块 表达式为真执行
eles
语句块 表达式为假执行
fi
- if嵌套:
if [测试表达式]
then
if [测试表达式]
then
语句块 表达式为真执行
eles
语句块 表达式为假执行
fi
eles
语句块 表达式为假执行
fi
- 复杂结构语句:
if [[ 表达式 ]] &&[[ 表达式 ]]
then
else
fi
- 表达式取反
if[ ! 表达式]
then
fi
练习:写一个脚本,输入一个文件名,用参数传递,判定文件存在否?是否为一个目录?是否为普通文件,且是空文件,就删除它。
- case结构:
case 字符串条件 in
匹配字符串1)
shell语句
;;
匹配字符串2)
shell语句
;;
*)#该处匹配任何语句
shell语句
;;
esac
- for循环结构:
形式1:
for ((I = 0 ; I <= 10 ; I++ ))
do
命令块
done
形式2:
for 变量名 in 参数列表
do
命令块
done
练习:
- 创建10个文件
#!/bin/bash
for (( I = 0 ; I <= 10 ; I++ ))
do
touch file_$I.txt
done
- 打印当前目录中的所用空文件
#!/bin/bash
LIST=`ls`
for FILE in $LIST
do
if [ ! -s $FILE ]
then
echo "文件$FILE是空文件!"
fi
done
- 编写一个脚本,将当前目录中的所有文件全部备份,文件名为:源文件名.back。
#!/bin/bash
LIST=`ls`
for FILE in $LIST
do
case $FILE in
file*)
cp $FILE ./$FILE\_back
;;
esac
done
- 字符串截取(不匹配字符)
符号 含义解析
KaTeX parse error: Expected '}', got '#' at position 8: {string#̲substring} 从变量{string}的开头, 删除最短匹配${substring}的子串
KaTeX parse error: Expected '}', got '#' at position 8: {string#̲#substring} 从变量{string}的开头, 删除最长匹配${substring}的子串
KaTeX parse error: Expected '}', got 'EOF' at end of input: …%substring} 从变量{string}的结尾, 删除最短匹配${substring}的子串
KaTeX parse error: Expected '}', got 'EOF' at end of input: …%substring} 从变量{string}的结尾, 删除最长匹配${substring}的子串
- while循环语句:
while [ 命令或表达式 ]
do
命令表
done
#!/bin/bash
I=1
SUM=0
while [ $I -ne 101 ]
do
SUM=`expr $SUM + $I`
I=`expr $I + 1`
done
echo "SUM=$SUM"
(三)函数
- 格式:
function_name( )
{
函数体
}
function functio_name( )
{
函数体
}
练习:
#!/bin/bash
function f ( )
{
echo "hello world"
echo $1
return 0
}
f ok
P=`f ok`#P中存放函数f的打印内容
echo "P=$P"
f ok
echo $?
#脚本调用其他脚本
A=`./hello.sh`