脚本bash是一个命令处理器,能执行用户直接输入的命令。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。
bash可以从文件中读取命令, 这样的文件称为脚本。在实际使用中,为了解决重复输入各种命令的问题,将这些命令按一定顺序、或逻辑放在文本文件中,可以构成一个bash脚本, 还支持循环、函数、条件等编程。
一、脚本的使用
1.1 sh脚本的使用
方法一:
- 创建一个文本文件,如test.sh
其中文件第一行必须是#!/bin/shtest.sh
#!/bin/sh
echo "hello world"
- 修改权限为可执行
$ chmod +x test.sh
- 执行脚本
$ ./test.sh
hello world
方法二:
- 创建一个文本文件,如test.sh
test.sh:
echo "hello world"
- 执行脚本
$ sh test.sh
hello world
如果直接执行,则提示没有权限
$ ./test.sh
bash: ./test.sh: Permission denied
方法一中的脚本也可以用sh执行,如下:
$ sh test.sh
hello world
1.2 bash脚本的使用
bash脚本语法基本同sh类似,最重要的地方是第一行由“#!/bin/sh”换为“#!/bin/bash.
1.3 作为系统命令使用
脚本也可以不需要像上述方法一带路径执行,也不需要像方法二那样使用解释器执行。可以将有执行权限的脚本放到系统的/bin/或/usr/bin/目录下,像ls,mv等命令一样使用。
$ sudo mv test.sh /usr/bin/
$ test.sh
hello world
二、脚本实例分析
2.1 参数使用
$ test.sh $1 $2 $3
$0: 脚本名
$0 $1 $N: (第几个)参数
$#: 参数个数
$@: 全部参数
∗
:
全部的参数,参数之间使用变量
*: 全部的参数,参数之间使用变量
∗:全部的参数,参数之间使用变量IFS值的第一个字符分隔,默认为空格,但是可以自定义
源码:
test.sh:
#!/bin/sh
echo '$0: '$0
echo '$#: '$#
echo '$1: '$1
echo '$2: '$2
echo '$@: '$@
echo '$*: '$*
测试:
$ sh test.sh a b
$0: test.sh
$#: 2
$1: a
$2: b
$@: a b
$*: a b
$ ./test.sh a b
$0: ./test.sh
$#: 2
$1: a
$2: b
$@: a b
$*: a b
2.2 循环for使用
test.sh:
#!/bin/bash
list="a b c"
for name in $list
do
echo $name
done
测试:
$ ./test.sh
a
b
c
2.3 while使用
test.sh:
#!/bin/bash
cnt=5
i=0
while [[ $i -le $cnt ]];
do
echo $i
((i++))
done
测试:
$ ./test.sh
0
1
2
3
4
5
2.4 if条件使用
test.sh:
#!/bin/bash
echo "\$#: $#"
if [ $# -eq 1 ]
then
echo "\$# == 1"
elif [ $# -gt 1 ]
then
echo "\$# > 1"
else
echo "\$# < 1"
fi
$ ./test.sh 1
$#: 1
$# == 1
$ ./test.sh 1 2$#: 2
$# > 1
常见if条件:
2.5 switch分支的使用
test.sh:
#!/bin/bash
case $1 in
"Apple")
echo "It's Apple"
;;
"Android")
echo "It's Android"
;;
*)
echo "unknown: $1"
;;
esac
$ ./test.sh Apple
It's Apple
$ ./test.sh banana
unknown: banana
2.6 函数的使用
test.sh:
#!/bin/bash
show_info()
{
echo "show info: \$1: "$1
echo "show info: \$2: "$2
}
case $1 in
"Apple")
show_info "It's Apple""my Apple"
;;
"Android")
show_info "It's Android""my Android"
;;
*)
echo "unknown: $1"
;;
esac
$ ./test.sh Apple
show info: $1: It's Apple
show info: $2: my Apple
2.7 IFS的使用
test.sh:
#!/bin/bash
echo " $@ : $@"
echo " $* : $*"
测试:
$ ./test.sh a b
$@ : a b
$* : a b
test.sh:
#!/bin/bash
IFS=‘|’
$ ./test.sh a b
$@ : a b
$* : a|b
三、常用命令行操作
3.1 拷贝文件scp
$scp ./src_file root@192.168.0.5:/home/
3.2 查找文件
$ find . -name \*.c
./server.c
./client.c
3.3 在文件中搜索
$ grep -nr "server_cmd_request_process" .
Binary file ./server_rcat matches
./server.c:22:int server_cmd_request_process(int task_id, int client_fd, cmd_hdr_t *cmd_hdr)
./server.c:100: server_cmd_request_process(task_id, client_fd, cmd_hdr);
$ grep -nr "server_cmd_request_process" server.c
22:int server_cmd_request_process(int task_id, int client_fd, cmd_hdr_t *cmd_hdr)
100: server_cmd_request_process(task_id, client_fd, cmd_hdr);
3.4 替换文件内容sed
使用sed命令可以替换文件中的内容
3.5 netstat
用于查看网络的连接情况,包括tcp、udp监听的端口和连接情况
3.6 ping/ping6
用于查看网络通断情况
3.7 man
用于linux系统查看函数API等
3.8 kill
通过进程号杀死程序
3.9 date
查看日期
3.10 cat
查看文件内容
3.11 压缩文件
tar -czf test.tar.gz
3.12 列出压缩文件列表
tar -tzf test.tar.gz
3.13 解压文件
tar -xvzf test.tar.gz