shell编程:编程就是这么简单

Q:

什么是shell编程?javascript

A:

shell编程就是经过语法将bash命令或外部命令整合起来,搭配正则表达式、管道命令与数据流定向等功能,来实现咱们要完成的任务最简单的shell script就是将多条命令写在一块儿,让用户能够一次性执行多条命令,同时每一个命令及其输入参数得以在纯文本的shell脚本中保存。shell脚本运行较慢,使用CPU资源较多,是一个很好的项目管理工具,但通常不用于大数据处理(注:本文部分例子来自《鸟哥的Linux私房菜》)。java


0 1

shell脚本基本编写规则node

shell脚本基本规则以下:正则表达式

命令的执行是由上而下,自左而右,空白行会被忽略;shell

空格不可省略,多个空格会被忽略;编程

每读到一个[Enter]命令就开始执行,拓展下一行可使用\[Enter]数组

命令的执行须要加绝对路径,不然默认在当前路径寻找脚本命令;ruby

经过环境变量PATH可设置脚本命令的查询范围,来简化脚本。bash

一个简单的shell脚本helloword以下所示:微信

#!/bin/bash#Show "Hello World!" in the screen#20170320 tengwkPATH=/opt/node/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbinexport PATHecho -e "Hello World! \n"exit 1
脚本通常分为四部分。其中第一行 #!/bin/bash 声明脚本类型(更为广泛来讲是语言解释器的路径),为 bash 脚本,除此以外其他 # 后面均为注释内容;以后为脚本环境变量例如 PATH LANG 设置,对于命令的执行很是重要;第三部分为主要程序执行部分,上面程序的含义是在屏幕上显示 “Hello World!” -e 表示使反斜杠转义, “\n” 表示换行并插入新一行;第四部分为告知执行结果,利用 exit 能够自定义错误信息,可使用环境变量?查看。脚本运行以下所示:

0 2

shell脚本基本结构

shell脚本的两个基本结构就是判断结构和循环结构,判断结构使用方法以下所示:

if [ 判断条件 ]; then执行命令1elif [ 判断条件 ]; then执行命令2fi

不一样判断条件之间能够经过逻辑链接符链接,接下来咱们经过一个askfor help小脚原本练习:

#!/bin/bash#ask if you can help me# 20170330 tengwkPATH=/opt/node/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbinexport PATHread -p "Can you help me (Y/N): " answerif [ "$answer" == "Y" ] || [ "$answer" == "y" ]; then#其中 [ "$answer" == "Y" ] || [ "$answer" == "y" ]也能够改写为[ "$answer" == "Y" -o "$answer" == "y" ]echo "I'm so glad to hear that, thank you!"elif [ "$answer" == "N" ] || [ "$answer" == "n" ]; thenecho "Thank you all the same!"elseecho "Sorry, i can't understand you!"exit 1fi

运行示例以下:

if可使用的判断符号有:

字符串判断

str1== str2  当两个串有相同内容、长度时为真

str1!= str2   当串str1str2不等时为真

-nstr1          当串的长度大于0时为真(串非空)

-zstr1          当串的长度为0时为真(空串)

str1              当串str1为非空时为真

数字的判断

int1-eq int2        两数相等为真

int1-ne int2        两数不等为真

int1-gt int2        int1大于int2为真

int1-ge int2        int1大于等于int2为真

int1-lt int2         int1小于int2为真

int1-le int2         int1小于等于int2为真

文件的判断

-rfile    用户可读为真

-wfile   用户可写为真

-xfile    用户可执行为真

-ffile    文件为正规文件为真

-dfile   文件为目录为真

-cfile    文件为字符特殊文件为真

-bfile    文件为块特殊文件为真

-sfile    文件大小非0时为真

-tfile    当文件描述符(默认为1)指定的设备为终端时为真

复杂逻辑判断

-a  

-o  

!    

while循环结构使用方法以下:

while [ 条件 ] do执行命令done

或者更为简单的能够在命令行执行的:

while 条件; do 执行命令; done

下面是一个选择食物的selectfood脚本:

#!/bin/bash#to input foods you like# 20170330 tengwkPATH=/opt/node/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbinexport PATHwhile [ "$word" != "END" -a "$word" != "end" ]#或者 until [ "$word" == "END" -o "$word" == "end" ]doread -p "Please input the foods you like, and press END to stop: " worddoneecho "OK! Now i know what you want eat."

运行示例以下:

另外一个更为经常使用的循环结构是 for 循环,经常使用来批量执行任务,以下所示:
for 变量名 in 单词组do 执行命令done

其中单词组不一样单词之间空格或者换行符分隔,例如咱们进入不一样项目文件夹批量解压序列文件:

for id in `ls`do cd $id gzip -d raw_reads.fq.gz cd ..done
0 3

shell脚本命令行参数

命令行参数是程序与用户交互的重要过程,能大大提升程序脚本的适用性。前面的 read 命令就是一个用户与程序交互的过程。在 shell 脚本中,命令行参数能够直接加在脚本后面,在脚本里使用默认变量“ $n ”来调用( n 为非负整数),下面经过一个小例子来了解 shell 脚本命令行参数使用方法:
echo $0echo $1echo $2

将上面脚本保存为sh04.sh并运行:

能够看出第一个变量$0为脚本名字,从$1开始为用户输入数据。当n大于10时须要添加大括号,例如${10}

if结构里添加参数-n能够检查命令行参数是否存在,$#能够表示参数个数,$@用来提取全部参数并构成数组,$*用来提取全部参数并构成字符串,以下所示:

if [ -n “$1” ]; then echo "Arguments exist!"else echo "No arguments"fiif [ $# -ne 2 ]; then echo "There are $#arguments"fiecho $@
将上面脚本保存为 sh05.sh ,运行以下所示:

假如想设置命令行选项,可使用getopts函数,该函数能够将命令行内容转换为变量。getopts包含两个内置变量,OPTARGOPTINDOPTARG就是将选项后面的参数保存在这个变量当中;OPTIND:这个表示命令行的下一个选项或参数的位置。

语法格式:getopts[option[:]] VARIABLE

getopts有两个参数,第一个参数是一个字符串,包括字符和“:”,每个字符都是一个有效的选项,若是字符后面带有“:”,表示这个字符有本身的参数。getopts从命令中获取这些参数,而且删去了“-”,并将其赋值在第二个参数中,若是带有本身参数,这个参数赋值在“OPTARG”中。

具体实例以下所示:
echo $*while getopts ":a:bc" optdo case $opt in a ) echo $OPTARG echo $OPTIND;; b ) echo "b $OPTIND";; c ) echo "c $OPTIND";; ? ) echo "error" exit 1;; esacdoneecho $OPTINDshift $(($OPTIND - 1))#经过shift $(($OPTIND - 1))的处理,$*中就只保留了除去选项内容的参数,能够继续使用后面的位置参数。echo $0echo $*
其中 ":a:bc" ,这就是一个选项字符串。对应到命令行就是 -a ,-b ,-c 。冒号又是什么呢?第一个冒号表示忽略错误,选项后面的冒号表示参数,一个冒号就表示这个选项后面必须带有参数,可是这个参数能够和选项连在一块儿写,也能够用空格隔开,好比 -a123 -a 123 (中间有空格) 都表示 123 -a 的参数;两个冒号的就表示这个选项的参数是可选的,便可以有参数,也能够没有参数,但要注意有参数时,参数与选项之间不能有空格。将上面脚本保存为 getopts.sh 。并运行以下所示:

本文分享自微信公众号 - 微生态与微进化(MicroEcoEvo)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索