桃之夭夭,灼灼其华

shell脚本

Word count: 2kReading time: 8 min
2020/06/02 Share

helloWord

1
2
3
4
5
6
7
#!/bin/bash 
echo 'helloword'
# 注释
# 1.#! 选择编译脚本的shell程序
# 2./bin/bash (Bourne Again Shell)免费易用的编译shell程序,被广泛使用
# 3.echo 向窗口输出文本信息
# 4.sh helloword.sh 执行程序

变量与参数

变量

  • 变量和等号之间不能有空格
  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头,可以包含下划线(_),不能包含bash关键字
  • 通过($)获取变量
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 变量
    var='变量'
    echo $var
    echo ${var}
    # 只读变量 readonly
    readonly_var='只读变量'
    readonly readonly_var
    echo ${readonly_var}
    # 删除变量 unset
    delete_var='删除变量'
    unset delete_var
    echo ${delete_var}

    数组

    shell中数组支持一维数组,没有数组大小限制
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 创建
    arr=(A B C D)
    # 打印 输出:A
    echo ${arr[0]}
    # 赋值 输出:a
    arr[0]='a'
    echo ${arr[0]}
    arr[4]='F'
    # 全部输出 输出:a B C D F
    echo ${arr[*]}
    # 数组长度 输出:5
    echo ${#arr[*]}
    # 数组元素长度 输出:1
    echo ${#arr[0]}

    参数

  • $0,$1..$n*向脚本传递参数
  • $*#:传递的参数个数
  • $**:传递的参数以字符串拼接输出
    1
    2
    3
    4
    echo "外部传入第一个的参数: $1"

    [[email protected] testshell]# sh helloword.sh 哈哈
    外部传入第一个的参数: 哈哈

字符处理

字符串可以单引号也可以双引号也可以不用引号
单引号:其中不能包含变量,不能包含单引号
双引号:可以包含变量和转义字符

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
# 字符串
var="a"
str="this is \"${var}\" !"
# str="this is ${var} !"
# str="this is "${var}" !"
# 输出:this is "a" !
echo $str
# 1.字符长度 输出:13
echo ${#str}
# 2.字符截取 从左开始0到4个字符 输出:this
echo ${str:0:4}
# 3.从左截取
# 输出:is "a" !
echo ${str#*is}
# 输出:"a" !
echo ${str##*is}
# 4.从右截取
# 输出:this
echo ${str%is*}
# 输出:th
echo ${str%%is*}
# 5.从左边第几个开始 输出:is "a" !
echo ${str:4}
# 6.从右边第几个开始,向右输出多少个 输出:"a"
echo ${str:0-5:3}
# 7.从右边第几个开始,一直到最后 输出:"a" !

流程控制(if,for,while)

if

1
2
3
4
5
6
7
8
9
if condition
then
command1
command2
...
commandN
fi
# 其他写法
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
1
2
3
4
5
6
7
8
9
if condition
then
command1
command2
...
commandN
else
command
fi
1
2
3
4
5
6
7
8
9
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

for

1
2
3
4
5
6
7
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

while

1
2
3
4
5
6
7
while condition
do
command
done

# 其他写法
for var in item1 item2 ... itemN; do command1; command2… done;

demo

递归遍历Linux文件目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 递归遍历Linux文件目录
#! /bin/bash
parm=$1

function read_file(){
# echo "inport parmater $1"

for file in `ls $1`
do
# echo "this is file name $file"
if [ -d $1"/"$file ]
then
read_file $1"/"$file
else
echo "this is file"$1"/"$file
fi
done
}
# echo "this is start file $parm"

read_file $parm

复制图片到指定目录

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
# 复制图片到指定目录
#!/bin/bash
echo "batch copy..."
# 获取参数位置为第二个和第三个
curpath=$1
topath=$2
# if语句 -z 字符运算判空
if [ -z $curpath ]; then
echo "Please enter as param 1"
exit
fi
if [ -z $topath ]; then
echo "Please enter webapps PATH as param 2"
exit
fi
# for循环 传入路径下以.JPG后缀的文件
for file in $curpath/*.JPG
do
# 字符操作构造目标文件地址
# echo ${file}
var=${file}
# echo ${var##*/}
picname=${var##*/}
# echo ${picname:0:8}
monthprefix=${picname:0:8}
# echo ${picname:0:10}
dayprefix=${picname:0:10}
path=$topath/$monthprefix/$dayprefix/
# echo $path
# 复制 -u 更新性复制,没有才复制 -v 输出复制结果
cp -u -v ${file} $path
done

运算

bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

算术运算

例如:a=10,b=20
加法 | expr $a + $b 结果为 30。 |
减法 | expr $a - $b 结果为 -10。 |
乘法 | expr $a \* $b 结果为 200。 |
除法 | expr $b / $a 结果为 2。 |
取余 | expr $b % $a 结果为 0。 |
赋值 | a=$b 将把变量 b 的值赋给 a。 |
相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |

注意:条件表达式要放在方括号之间,并且要有空格,例如:[$a==$b] 是错误的,必须写成 [ $a == $b ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
a=10
b=20
num=`expr $a + $b`
echo "加法:" $num
echo "减法:"`expr $a - $b`
echo "乘法:"`expr $a \* $b`
echo "除法:"`expr $a / $b`
echo "求余:"`expr $a % $b`

[[email protected] testshell]# sh helloword.sh
加法: 30
减法:-10
乘法:200
除法:0
求余:10

关系运算

例如:a=10,b=20
| -eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
| -ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
| -gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
| -lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
| -ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
| -le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |

布尔运算

| ! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
| -o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
| -a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |

逻辑运算

| && | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
| || | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |

字符运算

a=’abd’ b=’efg’
| = | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
| != | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
| -z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
| -n | 检测字符串长度是否为0,不为0返回 true。 | [ -n "$a" ] 返回 true。 |
| str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |

文件运算

| -b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
| -c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
| -d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
| -f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
| -g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
| -k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
| -p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
| -u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
| -r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
| -w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
| -x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
| -s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
| -e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |

CATALOG
  1. 1. helloWord
  2. 2. 变量与参数
    1. 2.1. 变量
    2. 2.2. 数组
    3. 2.3. 参数
  3. 3. 字符处理
  4. 4. 流程控制(if,for,while)
    1. 4.1. if
    2. 4.2. for
    3. 4.3. while
  5. 5. demo
    1. 5.1. 递归遍历Linux文件目录
    2. 5.2. 复制图片到指定目录
  6. 6. 运算
    1. 6.1. 算术运算
    2. 6.2. 关系运算
    3. 6.3. 布尔运算
    4. 6.4. 逻辑运算
    5. 6.5. 字符运算
    6. 6.6. 文件运算