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 解压文件。