2.3.Linux Bash
在介绍bash之前,需要先介绍它的起源——shell。shell俗称壳,它是指UNIX系统下的一个命令解析器;主要用于用户和系统的交互。UNIX系统上有很多种Shell。首个shell,即Bourne Shell,于1978年在V7(AT&T的第7版)UNIX上推出。后来,又演变出C shell、bash等不同版本的shell。
bash,全称为Bourne-Again Shell。它是一个为GNU项目编写的Unix shell。bash脚本功能非常强大,尤其是在处理自动循环或大的任务方面可节省大量的时间。bash是许多Linux平台的内定Shell,这也是我们介绍它主要的原因。

1) bash examples

(1) example 1

  • 新建文件bash.sh
1
$ touch bash.sh
Copied!
  • 为该文件添加可执行权限
1
$ chmod +x bash.sh
Copied!
  • 编辑bash.sh,内容如下:
提示:
下面这段代码在vi模式中输入,步骤为:
  • vi bash.sh
  • i # 在vi中输入i 即进入insert(写入)模式,即可对bash.sh 文档进行编辑
1
#!/bin/bash
2
echo "hello bash"
3
exit 0
Copied!
  • :wq # 保存并退出
说明:
#!/bin/bash : 它是bash文件声明语句,表示是以/bin/bash程序执行该文件。它必须写在文件的第一行! (写完之后就可以直接输入下面的代码,不创建文件也可以) echo "hello bash" : 表示在终端输出“hello bash” exit 0 : 表示返回0。在bash中,0表示执行成功,其他表示失败。
  • 执行bash脚本
    1
    sh bash.sh
    2
    # 或者
    3
    ./bash.sh
    Copied!
在终端输出“hello bash”即运行成功

(2) example 2

  • 创建测试文件。
1
echo -e 'a1\n1' > a1.txt
2
echo -e 'b1\n2' > b1.txt
3
echo -e 'c1\n3' > c1.txt
4
echo -e 'd1\n4' > d1.txt
5
echo -e 'e1\n5' > e1.txt
Copied!
  • 读取文件内容,编辑 read.sh。
1
#!/bin/bash
2
3
# 将文件名变量赋值
4
file1=a1.txt
5
file2=b1.txt
6
file3=c1.txt
7
file4=d1.txt
8
file5=e1.txt
9
10
# 对文件进行操作
11
12
## 显示a1.txt第一行。
13
head -n 1 ${file1}
14
15
## 将 b1.txt 的内容输出到终端
16
cat ${file2}
17
18
## 将 c1.txt 的最后的内容输出。
19
tail ${file3}
20
21
## 将 d1.txt 和 e1.txt 合并,然后输出到新的文件中 f1.txt
22
cat ${file4} ${file5} > f1.txt
Copied!
  • 执行 read.sh 脚本
1
sh read.sh
2
或者
3
chmod +x read.sh
4
./read.sh
Copied!
  • 提示:
    如果你想删掉之前练习用的多余文件,可以使用rm file_name命令进行文件删除

2) if

基本格式
if 条件1 then 命令1 elif 条件2 then 命令2 else 命令3 fi
表达形式
说明
-d file
判断是否为 “目录”
-f file
判断是否为 “文件”
-L file
判断是否为 “软链接”
-w file
判断是否为 “可写”
-x file
判断是否为 “可执行”
number1 -eq number2
number1 等于 number2
number1 -gt number2
number1 大于 number2
number1 -lt number2
number1 小于 number2
  • 示例: 判断文件test.sh是否存在,存在则输出“file exist”;没有则输出“file not exist”。
1
#!/bin/bash
2
3
if [ -f test.txt ];then
4
echo "file exist"
5
else
6
echo "file not exist"
7
fi
8
9
exit 0
Copied!
  • 示例: 提示用户输入值。若输入的值小于0,则输出“negtive number”;若等于0,则输出“number zero”,否则,输出“positive number”。
1
#!/bin/bash
2
3
# 提示用户输入一个值
4
echo -n "please input a number:"
5
6
# 保存用户输入的值到num中
7
read num
8
9
if [ "$num" -lt "0" ];then
10
# 小于0,则输出“negtive number”
11
echo "negtive number"
12
elif [ "$num" -gt "0" ];then
13
# 大于0,则输出“positive number”
14
echo "positive number"
15
else
16
# 大于0,则输出"number zero"
17
echo "number zero"
18
fi
19
20
exit 0
Copied!

3) for loop

基本格式
for 变量名in列表 do 命令1 命令2... done
格式说明
当变量值在列表里, for循环即执行一次所有命令,使用变量名访问列表中取值。命令可为任何有效的 shell命令和语句。变量名为任何单词。 in列表用法是可选的,如果不用它, for循环使用命 令行的位置参数。
  • 示例:
    输入当前文件夹的一级子目录中文件名字。
1
#!/bin/bash
2
3
# 将ls的结果保存到变量CUR_DIR中
4
CUR_DIR=`ls`
5
6
# 显示ls的结果
7
echo $CUR_DIR
8
9
for val in $CUR_DIR
10
do
11
# 若val是文件,则输出该文件名
12
if [ -f $val ];then
13
echo "FILE: $val"
14
fi
15
done
16
17
exit 0
Copied!

4) break and continue

基本格式
break命令允许跳出循环。 continue命令类似于 break命令,只有一点重要差别,它不会跳出循环,只是跳过这个循环步。
  • 示例:
    从0开始逐步递增,当数值等于5时,停止递增。Bash脚本内容如下:
1
#!/bin/bash
2
3
# 设置起始值为0
4
val=0
5
6
while true
7
do
8
if [ "$val" -eq "5" ];then
9
# 如果val=5,则跳出循环
10
break;
11
else
12
# 输出数值
13
echo "val=$val"
14
# 将数值加1
15
((val++))
16
fi
17
done
18
19
exit 0
Copied!
  • 示例:
    从0开始逐步递增到10:当数值为5时,将数值递增2;否则,输出数值。
1
#!/bin/bash
2
3
# 设置起始值为0
4
val=0
5
6
while [ "$val" -le "10" ]
7
do
8
if [ "$val" -eq "5" ];then
9
# 如果val=5,则将数值加2
10
((val=$val+2))
11
continue;
12
else
13
# 输出数值
14
echo "val=$val"
15
# 将数值加1
16
((val++))
17
fi
18
done
19
20
exit 0
Copied!

5) Homework

  • 写出一个 bash 脚本,可以使它自动读取一个文件夹(例如bash_homework/)的内容,将该文件夹下文件的名字输出到 filenames.txt, 子文件夹的名字输出到 dirname.txt 。
提示和作业要求:
下载bash_homework.zip并解压。(该文件位于该链接Files needed by this Tutorial中的清华云Bioinformatics Tutorial / Files路径下的相应文件夹中。)
将 bash 脚本, filename.txt, dirname.txt 写到同一个文件中上交。格式建议: word, pdf, txt.

6) More Reading

Linux 推荐章节:
  • 第11章 认识与学习bash; 第12章 正则表达式与文件格式化处理 第13章 学习shell script

7) References

Last modified 3mo ago