参考地址:
http://blog.csdn.net/zhuying_linux/article/details/6630220
优点:
shell简单、灵活,,对于linux系统的自动化管理非常有帮助,可以让系统管理员的工作变得容易、简单、高效。shell脚本可以在unix和linux系统中灵活移植。shell脚本方便获取和修改源码,不需要编译。
shell在linux很多地方都用到,熟悉shell命令,可以帮助解决一些故障问题。对于一个系统运维工程师来说是必要的。而且面试都会涉及到shell编程的内容。
缺点:
考虑效率时,例如一些算法的要求,就很少使用shell。例如一些复杂的算术运算,一般使用其它编程语言。
跨平台的需求。java和c语言都可以
复杂的编程需求。
安全性要求比较高的任务。
大规模文件操作。
多维数组支持。
数据结构支持。
图形化界面。
直接的系统硬件操作。
I/O或socket接口。
使用到库或者接口。
私人目的。
对于python用于机器学习,设计算法。或者设计脚本语言都是可以的,python的最大优势在于代码简单。
像matlab和r语言就比较适合一些计算处理。java在jsp,android,hadoop等都有很好的应用,c是比较低层的语言,对于一些底层的开发和深入的应用可以优先考虑。
第一个shell脚本tt.sh
#!/bin/bash
ls -l > dir.txt
通常shell脚本以.sh为后缀。在编写shell时,第一行一定要指明系统需要哪种shell解释用户的shell程序。因此,我们在执行的时候可以使用
sh tt.sh
或者使用
chmod 755 tt.sh
./tt.sh
先说第一个sh或者bash都可以执行tt.sh,他本来就是个bash脚本,用bash去执行无可厚非,但是用sh执行是为什么?sh是bash的链接文件,sh -> bash,可以从/bin/目录下查看,所以sh说白了就是使用的bash命令。另外,我们也可以使用-n或者-x来追踪bash程序的执行,#代表的是注释。
再说第二个,默认的tt.sh的权限是644,可以使用ls -al来查看,确实是rw_r__r__,没有执行权限,怎么执行.这里的主要原因是linux有个掩码值,跟ip地址的掩码有点类似。通过与掩码做运算才得到创建文件的权限。你可以去修改它,不过这里,对于既定的644,只有通过chmod来修改了,w代表是1,644每个位置加上1变成755,现在owner,group,others都可以执行它了
再说里面的内容ls -l > dir.txt。ls是列出某目录内容的命令。后面可以跟很多参数,用'man 命令'或者 '命令--help'自己去查吧,里面的东西很多,很强大。>是重定向。这个是输出重定向,是不是和c++的那个>>很像,这里也有>>。>代表是覆盖输出重定向,>>代表是追加输出重定向,就看输出到文件的内容会不会覆盖原来的东西。有输出重定向就有输入重定向。cat tt.sh这里用到了输入重定向,但是什么都没有额。tt.sh的内容重定向给了cat,可以加上一个<,变成cat < tt.sh,效果是一样的。还是前面的比较简单吧。
管道 |
这个也是经常使用的命令,|前面输出的东西作为输入给|后面的命令,因为有很多的时候你需要组合使用一些命令,最常用的组合就是查找过滤,ls -al 显示的东西太多,我们可以使用 ls -al | grep "xx"。这样,ls显示的东西,只有grep匹配到的才会显示出来。
shell里的特殊字符
特殊字符非常的重要,要想写出复杂的脚本,除了要对linux命令要了解以外,还要对特殊字符有所掌握,因为很多东西离开他根本处理不了。
$
最经常用到的地方就是引用变量内容,例如
a=10
echo $a
输出的就是a的值,如果不加$,输出的就是空。
另外,在脚本中加入
echo $#
echo $0
echo $1
echo $*
echo $@
执行 sh tt.sh 11 22 33
输出结果
3--输入参数个数
tt.sh--文件名
11--第一个参数
11 22 33--列出所有参数
11 22 33--同上
这些特殊符号在处理一些逻辑的时候是非常有用的。
""和''
这两个好像一样,但其实不一样。一样的地方是,里面的都是字符串。不一样的地方在于,$ 倒引号反斜线对于""是可以识别的,保留它的功能,对于''统统看作是字符串。
echo "$#"-----------3
echo '$#'-----------$#
倒引号``
esc下面的那个。倒引号可以和双引号,单引号并列来看,单引号最强,一切都是字符串,倒引号则是执行里面的语句。经常用在""中间。
运算符
就拿if来说,比较涉及的东西就非常的多。
bash中常用的条件测试
[ expression ]
[[ expression ]]
test expression
一般只使用一个大括号就可以,不行的时候试试两个,在不同的shell有不同的要求。
数字的比较和字符串的比较不同
数字的比较:
if [$1 -lt 10]--判断$1的值是否小于10
-gt 大于 -eq 等于 -ne 不等于 -ge 大于等于 -lt 小于等于
字符串的比较:
if [[ "$1" = "xiaobai"]]--也可以使用!=
if [ $1 -lt 10 ];then
echo "lt"
fi
判断语句的格式 if ; then fi 四个元素缺一不可,单大括号和双大括号都可以。但是大括号与第一个变量之间要有空格否则会报错。
if [ "$1" = "10" ];then
echo "lt"
fi
字符串的比较,单双大括号也都可以,=号只有一个。
-e FILE:文件是否存在
-f FILE:文件是否为普通文件
-d FILE:文件是否为目录
算术运算的几种结构
let算术运算表达式
let C=$A+$B
echo $C
echo $[$A+$B]
echo $(($A+$B))
echo `expr $A + $B`
case的基本格式
case ... in
...) do something here ;;
esac
打印99乘法表
for i in {1,2,3,4,5,6,7,8,9}
do
forj in {1,2,3,4,5,6,7,8,9}
do
((product=$i*$j))
echo -ne $i\*$j=$product"\t"
done
echo
done
exit 0
里面for循环的基本格式为,for in {} do do done。这是个双重的for循环。echo -ne 是不换行,并识别\转义。echo 就是换行一下。