shell脚本

脚本以#!/bin/bash开头

  • 输出Hello World !到/usr/test.txt(如果输入文本中带引号和$,需要用\进行转义)
    1
    2
    #!/bin/bash
    echo "\"Hello World\" !" > /usr/test.txt
    • 删除日志的一份shell脚本,当前路径在s下,然后要删除a,b,c下的log

    /s/a /s/b /s/c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/bin/bash
    # 定义变量folders
    # ()是数组
    folders=(a,b,c)
    # 使用${folders}引用变量
    # 逻辑循环
    for file in ${folders[*]}
    do
    cd ${file}
    for subfile in ./*
    do
    # test -d:检测是否是文件 (shell-test命令参考: https://www.cnblogs.com/guanyf/p/7553940.html)
    if test -d $subfile
    then
    name=${subfile##*/}
    # echo -e:激活转义(echo详细解释: https://blog.csdn.net/preamble_1/article/details/72900129)
    # 显示当前文件路径名称
    echo -e "\033[35m[$name]\033[0m"
    cd $name/log
    rm -rf $(find . -name "*.log")
    cd ../../
    fi
    done
    cd ..
    done

时间格式化

1
2
3
4
5
6
7
last_date=`date -d last-day +%Y%m%d`
last_date_dfs=`date -d last-day +%Y-%m-%d`
cur_date=`date +%Y%m%d`
cur_date_dfs=`date +%Y-%m-%d`

cur_datetime=`date +%Y%m%d %H%M%S`
...

Shell中单引号和双引号区别

1
2
3
1)在/home/atguigu/bin创建一个test.sh文件
vim test.sh
# 在文件中添加如下内容
1
2
3
4
5
6
7
#!/bin/bash
do_date=$1
echo '$do_date'
echo "$do_date"
echo "'$do_date'"
echo '"$do_date"'
echo `date`
  • 查看执行结果
1
2
3
4
5
6
test.sh 2019-02-10
$do_date
2019-02-10
'2019-02-10'
"$do_date"
2019年 05月 02日 星期四 21:02:08 CST
  • 总结:
    1
    2
    3
    4
    5
    (1)单引号不取变量值
    (2)双引号取变量值
    (3)反引号`,执行引号中命令
    (4)双引号内部嵌套单引号,取出变量值
    (5)单引号内部嵌套双引号,不取出变量值

Shell脚本中判断输入变量或者参数是否为空的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
1.判断变量
read -p "input a word :" word
if [ ! -n "$word" ] ;then
echo "you have not input a word!"
else
echo "the word you input is $word"
fi

2.判断输入参数
if [ ! -n "$1" ] ;then
echo "you have not input a word!"
else
echo "the word you input is $1"
fi

3. 直接通过变量判断
if [ ! $xxx ]; then
echo "IS NULL"
else
echo "NOT NULL"
fi


4. 使用test判断
得到的结果就是: dmin is not set!
if test -z "$xxx"
then
echo "dmin is not set!"
else
echo "dmin is set !"
fi

5. 使用""判断
if [ "$xxx" = "" ]
then
echo "dmin is not set!"
else
echo "dmin is set !"
fi

Shell中的${},##和%%的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
假设我们定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt

可以用${ }分别替换得到不同的值:

${file#*/}:删掉第一个/ 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个/ 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个. 及其左边的字符串:file.txt
${file##*.}:删掉最后一个. 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个/ 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配

${file:0:5}:提取最左边的5 个字节:/dir1
${file:5:5}:提取第5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:

${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为path:/path1/path2/path3/my.file.txt
${#var} 可计算出变量值的长度:

${#file} 可得到27 ,因为/dir1/dir2/dir3/my.file.txt 是27个字节

去掉最后/最前一个字符

1
2
1.去除字符串的首字符:${str:1}
2.去除字符串的最后一个字符:${str%?}

Shell的加减乘除

1
2
3
4
5
6
7
8
9
10
11
i=0
二次为i进行赋值
((i=$j+$k)) 等价于 i=`expr $j + $k`
((i=$j-$k)) 等价于 i=`expr $j -$k`
((i=$j*$k)) 等价于 i=`expr $j \*$k`
((i=$j/$k)) 等价于 i=`expr $j /$k`

expr不支持得到有小数点的除法, 如果结果可能得到小数, 可以使用bc工具,scale控制小数点后保留几位

num3=`echo "scale=2; $num1/$num2" | bc`
echo "num1/num2=$num3"

去除最后一个字符

1
2
3
4
有下面三种方式实现:
sed 's/.$//'
awk '{sub(/.$/,"")}1'
awk '{printf $0"\b \n"}' ufile