从0学习写shell
从0开始写shell
最近有用到和需要写一下shell脚本,记录一下学习的过程。 这么首先的话,我们会想到要参考或学习一下他人写的shell,比如说tomcat的bin目录下面的脚本等等。
1. 我们看到脚本的第一行都是#!/bin/sh或#!/bin/bash,那么#!/bin/sh是什么意思呢
#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。 其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本。 比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,甚至/bin/echo等等。 #!/bin/bash同理。
2. 基本语法
如果是学过其他动态语言的话,当然这个对你来说是相当的easy。
2.1. 变量的声明
使用name=value的格式,然后使用$name读取
msg1=Hellod
echo $msg1
而使用$0,$1, ..., $9 来读取命令调用的参数,其中$0表示当前文件本身
2.2. 流程控制语句(包括条件语句 if,循环语句 for、while,选择语句 case)
条件语句If..Then..Elif..Else
#!/bin/sh
if [ "$1" = "1" ]
then
echo "The first choice is nice"
elif [ "$1" = "2" ]
then
echo "The second choice is excellent"
else
echo "I see you were wise enough not to choose"
echo "You win"
fi
循环语句for
#!/bin/sh
fruitlist="Apple Pear Tomato Peach Grape"
for fruit in $fruitlist
do
if [ "$fruit" = "Tomato" ] || [ "$fruit" = "Peach" ]
then
echo "I like ${fruit}es"
else
echo "I like ${fruit}s"
fi
done
选择语句case
!#/bin/sh
case $1
in
1) echo 'First';;
2) echo 'Second';;
*) echo 'Other';;
esac
3. 脚本调用
fork: 如果脚本有执行权限的话,path/to/foo.sh。如果没有,sh path/to/foo.sh。 exec: exec path/to/foo.sh source: source path/to/foo.sh
fork fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用 foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。
exec exec 与 fork 不同,不需要新开一个子 Shell 来执行被调用的脚本. 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别.
source 与 fork 的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。
那么调用另一个shell是怎么传递参数的呢(使用$0,$1, ..., $9 来读取命令调用的参数,其中$0表示当前文件本身),看下面的示例:
#!/bin/bash
echo 'second.sh >>>>>>'
echo "${0} >>> ${1}"
./first.sh ${2}
#!/bin/bash
echo "fist.sh >>>>>>>"
echo "${0} >>> ${1}"
4. 统配符
使用的linux命令的鞋童应该都知道在操作命令的时候可以使用一些统配符,shell中也是一样。
符号 | 意义 |
* | 代表『 0 个到无穷多个』任意字符 |
? | 代表『一定有一个』任意字符 |
[] | 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 |
[-] | 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! |
[^] | 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。 |
还有一些其他的特殊字符,有兴趣的可以去看一下《鸟哥的linux私房菜》这本书。
5. 信息输出
可以使用>将我们需要的信息输出到文件,比如 ls > lsinfo.txt;如果是追加到文件的话使用>>,比如 ls >> lsinfo.txt
而<则是读取文件内容,比如grep searchterm < file.txt
参考网址: [1]: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html#toc7 [2]: https://supportweb.cs.bham.ac.uk/docs/tutorials/docsystem/build/tutorials/unixscripting/unixscripting.html [3]: https://www.tutorialspoint.com/unix/unix-what-is-shell.htm [4]: http://blog.csdn.net/simple_the_best/article/details/76285429 [5]: http://blog.csdn.net/miss_acha/article/details/24462519 [6]: http://www.cnblogs.com/EasonJim/p/6850319.html [7]: http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html