2021-07-24 04 Shell 脚本编程

From 生信技能树
-视频回放:Linux-conda的安装及使用2
-课件:
-总课时长:2小时28分13秒 1小时10分开始~
-主讲人:卖萌哥
•Shell 脚本
•任务提交

Shell 脚本

shell 脚本:为了和普通文本文件区分开,通常shell脚本都会以.sh为后缀名.。

瞎子(电脑)打灯笼(后缀):并不是电脑不知道这是什么文件,而是为了让你知道这是什么文件。
Vim 编辑器

Mar23 23:16:22 ~
$ vim file1
Mar23 23:17:18 ~
$ bash file1
Welcome to Biotrainee()

脚本首行的#! 是Linux的Shebang (释伴)符号,指定解释器。

我觉得可以理解为特定代码的翻译官。

Mar23 23:17:43 ~
$ vim file1.sh

#1/bin/bash #即我就要根目录下的bin里面的bash来执行我的内容。
echo "Welcome to Biotrainee()"

更高级写法:根据具体环境应用bash,没有写死。

Mar23 23:36:17 ~
$ vim file1..sh

#1/usr/bin/env bash
echo "Welcome to Biotrainee()"

1:标准输出流 2:标准误输出流(程序出错的部分)

Mar23 23:49:14 ~
$ vim test.sh
Mar23 23:50:11 ~
$ cat test.sh 
#!/usr/bin/env bash
pwd
pwd
ppp

1.不进行重定向,结果直接输出到标准输出流(屏幕)

Mar23 23:50:17 ~
$ bash test.sh 
/trainee2/Mar23
/trainee2/Mar23
test.sh: line 4: ppp: command not found

2.进行重定向,但不指定标准输出和标准误输出,正确的在out.log中,错误的输出到标准输出流(屏幕),这样报喜不报忧的方式很危险,没有告你错在哪儿了。

Mar23 23:50:46 ~
$ bash test.sh > out.log
test.sh: line 4: ppp: command not found
Mar23 23:51:44 ~
$ cat out.log 
/trainee2/Mar23
/trainee2/Mar23

3.进行分开重定向,正确与错误分别进入两个log文件。有点在于方便debug,缺点是有时候(介入脚本洗的不好)会失去上下文联系。

Mar23 23:51:53 ~
$ bash test.sh 1>out.log 2>error.log
Mar23 00:01:17 ~
$ cat out.log 
/trainee2/Mar23
/trainee2/Mar23
Mar23 00:01:33 ~
$ cat error.log 
test.sh: line 4: ppp: command not found
Mar23 00:01:36 ~
$ cat -n test.sh 
     1  #!/user/bin/env bash
     2  pwd
     3  pwd
     4  ppp

4.进行分开重定向,将2输出到1中,两者都输出到out.log

Mar23 00:02:40 ~
$ bash test.sh 1>out.log 2>&1
Mar23 00:06:04 ~
$ cat out.log 
/trainee2/Mar23
/trainee2/Mar23
test.sh: line 4: ppp: command not found

后缀.log也是瞎子打灯笼的原理,写log就知道它是日志文件,写其他比如jimmy也行,但是不方便你理解。.sh、.r、.py都是约定俗成的,只是叫别的你可能就不知道这是什么格式的文件。

Shell 脚本:修改shell脚本的文件权限后,可以全路径调用,不需要用bash。

image.png

为什么是124?因为0-7可以有这三个数字组合而成。太牛了~

Mar23 00:06:23 ~
$ ll test.sh
-rw-rw-r-- 1 Mar23 Mar23 33 Aug 24 23:50 test.sh
Mar23 00:19:09 ~
$ chmod 764 test.sh  #change mode 
Mar23 00:21:17 ~
$ ll test.sh
-rwxrw-r-- 1 Mar23 Mar23 24 Aug 25 00:21 test.sh*
Mar23 00:38:50 ~
$ ./test.sh  #因为test.sh不在环境变量里(TAB不能补齐可以知道),或者说不在PATH里面,所以要写./ ,直接写test.sh会找不到命令。
Hi Welcome 

修改为不可执行的:

Mar23 00:56:01 ~
$ chmod 664 test.sh 
Mar23 01:01:01 ~
$ ll test.sh 
-rw-rw-r-- 1 Mar23 Mar23 38 Aug 25 00:46 test.sh
Mar23 01:01:08 ~
$ ./test.sh
-bash: ./test.sh: Permission denied
Mar23 01:01:21 ~
$ ./test #此时不可以自动补齐,因为不可执行
Mar23 01:04:06 ~
$ bash test.sh  #此时要借助bash执行。
Hi Welcome

参数传递

Mar23 01:04:19 ~
$ cat test2.sh 
#!/usr/bin/env bash
cat $1 
Mar23 01:08:40 ~
$ bash test2.sh readme.txt #因为1是readme.txt 的位置参数, test2.sh脚本本身的位置参数是0,后面一次类推。
Welcome to Biotrainee() !
This is your personal account in our Cloud.
Have a fun with it.
Please feel free to contact with me( email to jmzeng1314@163.com )
(http://www.biotrainee.com/thread-1376-1-1.html)

再加一个,写到100个命令都可以,但是>=10以上的位置参数要加{},这样写提高了更大的自由度。

Mar23 01:14:25 ~
$ vim test2.sh

#!/usr/bin/env bash
cat $1
echo "This is $0"
Mar23 01:14:14 ~
$ bash test2.sh readme.txt 
Welcome to Biotrainee() !
This is your personal account in our Cloud.
Have a fun with it.
Please feel free to contact with me( email to jmzeng1314@163.com )
(http://www.biotrainee.com/thread-1376-1-1.html)
This is test2.sh

假如第一个参数位置没有文件,所以命令cat就显示了一个寂寞。

Mar23 01:15:21 ~
$ bash test2.sh 
                                     #显示虚空

cat要重定向,才会打一句就不打,不然就会打一句显示一句。


image.png

任务提交:

•nohup:不要挂断任务,即把任务提交到服务器上运行,通常与&连用
•& :任务后台运行,通常与nohup连用
•top :实时显示系统中各个进程的资源占用状况,按q退出;htop -u Mar35 更常用。
•ps:Process Status列出当前系统中运行的进程列表,一般加上–ef参数
•kill :杀掉进程,kill PID
cat 要重定向到一个文件才可以打印

Mar23 01:25:27 ~
$ cat sleep.sh 
#!/usr/bin/env bash
for i in {1..500}
do 
echo $i >> sleep.out 
sleep 2s 
done
Mar23 01:25:34 ~
$ bash sleep.sh  

双击现在的窗口新建一个窗口,动态查看之前窗口的命令:
方法1、tail -f ,不加f则不能动态查看

Mar23 01:27:58 ~
$ tail -f sleep.out  #ctrl+c退出

方法2、less

Mar23 01:28:43 ~
$ less sleep.out  #shift+f 进入动态查看,ctrl+c退出动态查看,q退出命令。

关掉之前开的窗口(模拟断网),那么现在窗口ll后就不会实时显示了,因为我的命令时前台执行的,如果关掉了,就不会执行了。那我又不能守在电脑旁,又期盼网络连接一直正常,所以就挂后台。

Mar23 01:29:25 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 780 Aug 25 01:33 sleep.out
Mar23 01:34:02 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 780 Aug 25 01:33 sleep.out
Mar23 01:34:10 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 780 Aug 25 01:33 sleep.out
Mar23 01:34:11 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 780 Aug 25 01:33 sleep.out

挂后台:无论断开还是关掉,都可以正常运行

Mar23 01:34:12 ~
$ nohup bash sleep.sh &
[1] 22179
Mar23 01:38:19 ~
$ nohup: ignoring input and appending output to 'nohup.out' #这句不是报错,只是一句提醒,把你的所有输出存到nohup.out文件里面了。再按一下回车就回到正常了。
Mar23 01:39:41 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 942 Aug 25 01:40 sleep.out
Mar23 01:40:12 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 945 Aug 25 01:40 sleep.out
Mar23 01:40:14 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 948 Aug 25 01:40 sleep.out

做生信就像放羊。

htop -u Mar35


image.png

kill -9: 用第九种方式无条件杀命令(满清十大酷刑,这是最好的~)

Mar23 01:40:16 ~
$ ps -ef | grep "Mar23"
Mar23    22179 19799  0 01:38 pts/10   00:00:00 bash sleep.sh #找到这条进程的编号22179
Mar23 01:54:09 ~
$ kill -9 22179
Mar23 01:54:23 ~
$ ll sleep.out  #查看这只羊是不是还在吃
-rw-rw-r-- 1 Mar23 Mar23 2723 Aug 25 01:55 sleep.out
[1]+  Killed                  nohup bash sleep.sh
Mar23 01:56:30 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 2864 Aug 25 01:56 sleep.out
Mar23 01:56:46 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 2867 Aug 25 01:56 sleep.out
Mar23 01:56:48 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 2870 Aug 25 01:56 sleep.out #竟然还在变,猜测还有没杀干净的。

用ps -ef | grep "Mar23"继续查看,发现还有一个sleep.out,没杀干净继续杀:

Mar23 01:56:49 ~
$ ps -ef | grep "Mar23"
Mar23 01:57:18 ~
$ kill -9 25304
Mar23 01:57:41 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 2968 Aug 25 01:57 sleep.out
Mar23 01:57:56 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 2968 Aug 25 01:57 sleep.out
Mar23 01:57:59 ~
$ ll sleep.out 
-rw-rw-r-- 1 Mar23 Mar23 2968 Aug 25 01:57 sleep.out

1.阮一峰的bash脚本教程(纯计算机内容)https://wangdoc.com/bash/
2.鸟哥的Linux私房菜:基础学习篇第四版(第14章)https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/104.html

如何前台执行一个命令?
如何挂后台?
动态查看输出结果?
查看运行结果?top htop
如何找到编号并杀掉?(身份证号写到死亡笔记上面)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容