shell的基本使用
1.第一行
写#!/bin/bash
,#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 bash 程序。
2.运行脚本
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
3.变量设置
your_name="harry"
注意,变量名和等号之间不能有空格
- 首个字符必须为字母(a-z,A-Z)。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
4.if-else的使用
if condition
then
command1
command2
...
commandN
fi
注意:必须以fi
结尾
if else-if else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
5.运算符
#!/bin/bash
a=10
b=20
c="company"
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
if [ $c = "company" ]
then
echo "c 是 company"
fi
输出:
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b
c 是 company
注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
- 完整的表达式要被 反引号````包含
- 条件表达式要放在方括号之间,并且要有空格,例如:
[$a==$b]
是错误的,必须写成[ $a == $b ]
- 乘号(*)前边必须加反斜杠(\)才能实现乘法运算
- 字符串是否相等使用
=
,不是==
6.在Linux bash下读取用户输入
echo "Input something:"
read input
echo "Your input is: $input"
输出:
Input something:
test
Your input is: test
7.在Windows上编写完成后,在Linux上运行先使用
vim test.sh
:set ff?
检查编码格式,如果出现fileforma=dos
,则使用:set fileformat=unix
改变编码。
因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符。
脚本文件是DOS格式的, 即每一行的行尾以 来标识, 其ASCII码分别是0x0D, 0x0A。
8.脚本使规范
usage(){
echo -e "Usage: ./test.sh -d [pwd] -u [pwd]
-d 指定输出目录,且不以/结尾
-u 指定解压目录,且不以/结尾
-h, --help 使用帮助
Sample: ./mrs.sh -d \"/data/out\" -u \"/data/zip\" "
exit 1
}
if [[ $# -eq 0 ]]; then
usage
fi
while [ $# -gt 0 ]; do
case $1 in
-h|--help)
usage
shift 1
;;
-d)
if [[ $2 ]]; then
outDir=$2
shift 2
else
usage
shift 1
fi
;;
-u)
if [[ $2 ]]; then
unzipDir=$2
shift 2
else
usage
shift 1
fi
;;
*)
usage
shift 1
;;
esac
done
if [[ "$outDir" = "" || "$unzipDir" = "" ]]; then
usage
fi
9.tar与unzip解压到指定目录
tar zxvf xxx.tar.gz -C ./test
unzip xxx.zip -d ./test
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
下面的参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
10.字符串分割
假设有变量var=CQ_QQ_2017071115
var=CQ_QQ_2017071115
# #号截取,删除左边字符,保留右边字符
echo ${var#*_}
#号是运算符,*_ 表示从左边开始删除第一个 _ 号及左边的所有字符
>QQ_2017071115
# ##号截取,删除左边字符,保留右边字符
echo ${var##*_}
##*_ 表示从左边开始删除最后(最右边)一个 _ 号及左边的所有字符
>2017071115
# %号截取,删除右边字符,保留左边字符
echo ${var%_*}
%_* 表示从右边开始,删除第一个 _ 号及右边的字符
>CQ_QQ
# %%号截取,删除右边字符,保留左边字符
echo ${var%%_*}
%%_* 表示从右边开始,删除最后(最左边)一个 _ 号及右边的字符
>CQ
# 从左边第几个字符开始,及字符的个数
echo ${var:0:6}
0代表从0开始,截取6个字符
>CQ_QQ_
# 从左边第几个字符开始,一直到结束
echo ${var:7}
7代表从7开始,截取到最后
>017071115
# 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数
>707
# 从右边第几个字符开始,一直到结束
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束
>7071115
11.awk的简单使用
比如现在文件目录为
CQ_QQ_2017071110_LO.tar.gz
CQ_QQ_2017071111_LO.tar.gz
CQ_QQ_2017071210_LO.tar.gz
CQ_QQ_2017071211_LO.tar.gz
现在使用
list_alldir(){
for file in $1/*
do
if [ -d $file ]; then
list_alldir $file
else
filename=${file##*/.} # 从路径中取出文件名
fileName=`echo $filename | awk -F '_' '{print $3}'`
if [[ `echo ${fileName:0:8}` = $2 ]]
then
tar zxf $file -C ./test #解压文件
fi
fi
done
}
其中fileName=`echo $filename | awk -F '' '{print $3}'`意思为将filename以'_'分割(awk -F ''),分割后为四段,分别为'CQ','QQ','2017071110','LO.tar.gz',然后我们取第三段('{print $3}'),再echo输出,最后赋值给fileName。
再判断if [[ `echo ${fileName:0:8}` = $2 ]] 如果日期等于输入的日期就执行,tar zxf \$file -C ./test
解压文件。