一、如何创建脚本
1、新建一个文件(后缀为.sh)
2、编辑该文件
vim 1.sh
3、运行的时候没有可执行权限,需要人为去添加
chmod 777 1.sh
4、运行
./1.sh
二、变量
2.1用户自定义变量
shell允许用户建立 变量存储类型
注意:任何赋给变量的值都被shell解释为一串字符
命名规范:
- 由数字、字母、下划线组成
- 首字母不能为数字
- shell中的变量一般用大写表示
注意:
- 要取用一个变量的值时,在变量名前加$
- 在赋值时,等号的左右两侧不能有空格
2.2预定义变量
$#:包含命令行参数的个数
$@:包含所有命令行参数
$*:包含所有命令行参数
$?:包含前一个命令的退出状态,正常退出返回0,反之为非0(shell中0为真,非0为假)
$$:包含正在执行的进程的ID号
三、shell程序和语句
3.1说明性语句
注释:#
3.2功能性语句
输出、输入
3.3算术运算
expr主要用于进行简单的整数的算术运算、+、-、\*、/、%
注意:expr与变量以及变量与运算符之间必须有空格
四、text
4.1字符串测试
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1字符串的长度是否为0
-n s1 测试s1字符串的长度是否不为0
注意:“[”的右边,以及”]“的左边以及等号的左右两侧必须有空格
4.2整数测试
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
4.3文件测试
-d name 测试name是否为一个目录
-f name 测试name是否为普通文件
-L name 测试name是否为链接文件
-c 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更旧
五、选择、循环语句
5.1if多分支选择
if [ 表达式1 ]
then
语句1
elif [ 表达式2 ]
then
语句2
.............
elif[ 表达式n ]
then
语句n
else
语句n+1
fi
5.2case语句
case 字符串变量 in
模式1)
语句1
;;
模式2)
语句2
;;
.................
模式n)
语句n
;;
*)
语句n+1
;;
esac
5.3for循环语句
for 变量名 in 单词表
do
语句
done
案例:打印9*9乘法表
5.4while循环语句
while [表达式]
do
语句
done
案例:打印9*9乘法表
六、函数
6.1定义
方式1:
函数名()
{
}
方式2:
function 函数名()
{
}
注意:一般使用的是方式2
6.2调用
方式1:
变量名=`函数名 参数列表`
注意:
- 子函数中的所有标准输出传递给了主程序中的变量
- 子函数中的$n并非shell中的$n
方式2:
函数名 参数列表
注意:一般使用的是方式2
七、示例
- 判断用户主目录是否有file-dir和dir-dir目录如果这两个目录存在,询问是否删除这两个目录 如果用户的是Y,将这两个目录删除,重新创建这两个目录 如果是N,取消删除 如果上述的目录不存在,则创建这两个目录
- 请用户输入一个路径,将这个路径下的文件拷贝到file-dir这个目录,将这个路径下的目录拷贝到dir-dir目录
- 统计拷贝的文件和目录的个数
#!/bin/bash
for dir in $HOME/file-dir $HOME/dir-dir
do
if [ -d $dir ]
then
read -p "是否删除这两个目录!(Y,N)
" op
case $op in
'Y')
rm -r $dir
echo "删除成功"
;;
'N')
echo "取消删除"
esac
else
mkdir $dir
echo "创建成功!"
fi
done
filecount=0
dircount=0
read -p "请输入一个路径:
" pathname
flist=`ls $pathname`
for file in $flist
do
if [ -f $pathname/$file ]
then
cp $pathname/$file $HOME/file-dir
filecount=`expr $filecount + 1`
elif [ -d $pathname/$file ]
then
cp -r $pathname/$file $HOME/dir-dir
dircount=`expr $dircount + 1`
fi
done