Shell脚本学习

shell特性

查看历史命令history

shell中history命令可以查看历史命令,默认保存1024条历史命令记录。
shell中使用!!自动执行上一条历史命令。
shell中使用!num表示执行第num条历史命令。
shell中使用!str表示执行最近的以str开头的命令。

alias 和 unalias

alias给一条命令设置别名,简化操作。unalias取消别名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[CaseZheng@home Study]$ alias myls="ls -la"
[CaseZheng@home Study]$ myls
总用量 44
drwxrwxr-x. 9 CaseZheng CaseZheng 4096 7月 26 23:14 .
drwx------. 29 CaseZheng CaseZheng 4096 7月 29 11:49 ..
drwxrwxr-x. 5 CaseZheng CaseZheng 4096 6月 5 22:52 BoostStudy
drwxrwxr-x. 8 CaseZheng CaseZheng 4096 7月 29 11:52 .git
-rw-rw-r--. 1 CaseZheng CaseZheng 41 6月 3 22:00 .gitignore
drwxrwxr-x. 2 CaseZheng CaseZheng 4096 6月 3 22:00 Lua_C_Server_Client
drwxrwxr-x. 2 CaseZheng CaseZheng 4096 6月 26 23:03 Mahjong
drwxrwxr-x. 2 CaseZheng CaseZheng 4096 7月 27 22:55 Python
-rw-rw-r--. 1 CaseZheng CaseZheng 8 6月 3 22:00 README.md
drwxrwxr-x. 3 CaseZheng CaseZheng 4096 6月 3 22:00 Redis_Lua
drwxrwxr-x. 3 CaseZheng CaseZheng 4096 7月 27 22:55 WebStudy
[CaseZheng@home Study]$ unalias myls
[CaseZheng@home Study]$ myls
bash: myls: 未找到命令...
[CaseZheng@home Study]$

> >> <

> 重定向
>> 追加
< 反向重定向

1
2
3
4
5
6
7
8
9
10
11
[CaseZheng@home ~]$ echo "hello shell" > hello.txt
[CaseZheng@home ~]$ cat hello.txt
hello shell
[CaseZheng@home ~]$ echo "hello clear" > hello.txt
[CaseZheng@home ~]$ cat hello.txt
hello clear
[CaseZheng@home ~]$ echo "hello append" >> hello.txt
[CaseZheng@home ~]$ cat hello.txt
hello clear
hello append
[CaseZheng@home ~]$

2> 错误重定向
2>> 错误追加

1
2
3
4
5
6
7
8
9
[CaseZheng@home ~]$ ls hahaha
ls: 无法访问'hahaha': No such file or directory
[CaseZheng@home ~]$ ls hahaha 2> log.txt
[CaseZheng@home ~]$ cat log.txt
ls: 无法访问'hahaha': No such file or directory
[CaseZheng@home ~]$ ls 2> log.txt
Blog hello.txt log.txt Package PythonWeb SourceCodeAnalysis Study 桌面
[CaseZheng@home ~]$ cat log.txt
[CaseZheng@home ~]$

shell脚本

  1. #!/bin/sh #!/bin/bash 写在shell脚本第一行 指名脚本解释执行的解释器
  2. # 除第一行以#!开头有特殊用途外 其它以#开头的行均为注释
  3. chmod a+x xxx.sh 给xxx.sh增加执行权限
  4. bash -x xxx.sh 查看xxx.sh的执行过程

date

打印或设置系统日期和时间

shell变量

注意等于号左右不能有空格

1
2
3
4
#!/bin/sh
test="test str"
echo $test
echo ${test} # 花括号可以帮助解释器识别变量边界

unset 命令可以删除变量

1
2
3
4
#!/bin/sh
test="test str"
unset test
echo $test

readonly 命令使变量只读 unset不能删除只读变量

1
2
3
4
5
6
7
8
9
[CaseZheng@localhost ~]$ cat test.sh
#!/bin/sh
readonly a=10
a=20
[CaseZheng@localhost ~]$ bash -x test.sh
+ readonly a=10
+ a=10
+ a=20
test.sh:行3: a: 只读变量

shell读取命令行参数

  1. $0 命令本身
  2. $1 $2 $3 以此为参数1 2 3
  3. $# 参数个数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [CaseZheng@localhost ~]$ cat test.sh
    #!/bin/sh
    echo $0
    echo $1
    echo $2
    echo $3
    echo $#
    [CaseZheng@localhost ~]$ ./test.sh 10 11 12 13 14 15
    ./test.sh
    10
    11
    12
    6

从屏幕读入

1
2
3
4
5
6
7
[CaseZheng@localhost ~]$ cat test.sh
#!/bin/sh
read -p "请输入" num
echo $num
[CaseZheng@localhost ~]$ ./test.sh
请输入4
4

算术运算

1
2
3
4
5
6
7
8
9
10
11
[CaseZheng@localhost ~]$ cat test.sh
#!/bin/sh
a=1;
b=2;
echo $a+$b # 字符串连接
echo $[$a+$b] # 算术运算
echo $(($a+$b)) # 算术运算
[CaseZheng@localhost ~]$ ./test.sh
1+2
3
3

数字比较

  1. -eq 相等(equal)
  2. -ne 不等(not equal)
  3. -gt 大于(greater than)
  4. -lt 小于(less than)
  5. -ge 大于等于 (greater than or equal)
  6. -le 小于等于 (less than or equal)

流程控制

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
[CaseZheng@localhost ~]$ cat test.sh
#!/bin/sh
if [ 1 -eq 1 ] # 方括号两边都要有空格 == 两边加空格
then
echo "true"
fi


if [ 1 -eq 2 ] # 方括号两边都要有空格 == 两边加空格
then
echo "true"
else
echo "false"
fi
[CaseZheng@localhost ~]$ bash -x test.sh
+ '[' 1 -eq 1 ']'
+ echo true
true
+ '[' 1 -eq 2 ']'
+ echo false
false
[CaseZheng@localhost ~]$ cat test.sh
#!/bin/sh
if [ 1 -eq 2 ]
then
echo "true 1==2"
elif [ 1 -lt 2 ] # 小于等于
then
echo "true 1<2"
else
echo "false"
fi
[CaseZheng@localhost ~]$ bash -x test.sh
+ '[' 1 -eq 2 ']'
+ '[' 1 -lt 2 ']'
+ echo 'true 1<2'
true 1<2