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
shell脚本基本结构
shell脚本的两个基本结构就是判断结构和循环结构,判断结构使用方法以下所示:
if [ 判断条件 ]; then执行命令1elif [ 判断条件 ]; then执行命令2fi
不一样判断条件之间能够经过逻辑链接符链接,接下来咱们经过一个askfor help小脚原本练习:
#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 当串str1和str2不等时为真
-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 变量名 in 单词组do 执行命令done
其中单词组不一样单词之间空格或者换行符分隔,例如咱们进入不一样项目文件夹批量解压序列文件:
for id in `ls`do cd $id gzip -d raw_reads.fq.gz cd ..done
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 $@
假如想设置命令行选项,可使用getopts函数,该函数能够将命令行内容转换为变量。getopts包含两个内置变量,OPTARG和OPTIND。OPTARG就是将选项后面的参数保存在这个变量当中;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 $*

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