一. 查看当前shell使用的类型
-- ps 或 echo $SHELL 都可以。注意:SHELL一定要大写
二. 如何运行编写好的shell
首先cd 到test.sh的目录下,然后 ./test.sh 或者 sh/bash test.sh 或者 chmod +x test.sh,
如果有参数的话就带上参数 ./test.sh param1 param2 ......
三. 比较常用的shell变量
$# -- 脚本的参数个数
$* -- 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$$ -- 脚本运行的当前进程ID号
$! -- 后台运行的最后一个进程的进程ID号
$@ -- 与$*相同,但是使用时加引号,并在引号中返回每个参数
$< -- 所有的依赖目标集
$- -- 显示shell使用的当前选项,与set命令功能相同
$? -- 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
$0 -- 脚本名称
$1..$9 -- 第N个参数
$() -- 命令替换,等价于反括号``的作用,能把shell中一个命令的标准输出嵌入到原来的位置!
详情参考:http://blog.youkuaiyun.com/firefoxbug/article/details/7558665
四. shell脚本的第一行中,必须写#!/bin/bash吗?
---------------------------------------------------------------------------------------------
本人初学linux不久,发现在编写脚本的时候开头都有一行#!/bin/sh
我记得#是表示注释的,那么这一行应该是可以不写的吧?为什么又说“这条语句告诉操作系统用来解释脚本的程序位置。”呢?
---------------------------------------------------------------------------------------------
#!/bin/sh
表示本脚本由/bin/路径的sh程序来解释....
跟命令行下~
#/bin/sh Scriptname效果相同...
---------------------------------------------------------------------------------------------
但是#不是用来表示注释的吗?难道这里的#不是这个意思?
---------------------------------------------------------------------------------------------
不同的地方,#有不同的意思
就好比c++里面用“//”来注解
vb里面用“'”注解一样
dns里面用“;”来注解
shell的开头那个#不是用来注解的
---------------------------------------------------------------------------------------------
如果你要用给该脚本执行权限的话...第一行必须声明该脚本由什么来解释...
#的确表示注释.第一行的你只需要知道是声明解释程序的路径就好了 :)
假如第一行是别的东西.而你又给了x权限,执行的时候就会出错...
可以不写.执行时手工执行...
/bin/sh xxxx.sh
效果是一样的 ...
---------------------------------------------------------------------------------------------
如果不写也成,那就用你登陆的那个shell来解释执行.
---------------------------------------------------------------------------------------------
可以不写,但应该有良好的编程习惯
---------------------------------------------------------------------------------------------
#通常用作注释,但是#!放在一起就标志着这是一个shell script,其后的路径指出了用来解释这个script的程序。
如果一个script只是一些普通linux指令的堆砌。那么#!可以略去不写。但通常我们遇到的都不是这种情况。
如果这个script中包含一些自定义的程序组件,比如说函数,变量等,#!便需要标注。
在shell脚本的开头往往有#!打头的一句话来定义使用哪种sh解释器来解释该脚本。
目前研发送测的shell脚本中主要有以下两种方式:
(1) #!/bin/sh
(2) #!/bin/bash
在这里求教同福客栈的各位大侠们一个问题:
以上两种方式有什么区别?对于脚本的实际运行会产生什么不同的影响吗?
脚本test.sh内容:
#!/bin/sh
source pcy.sh #pcy.sh并不存在
echo hello
执行./test.sh,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
由此可见,在#!/bin/sh的情况下,source不成功,不会运行source后面的代码。
修改test.sh脚本的第一行,变为#!/bin/bash,再次执行./test.sh,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
hello
由此可见,在#!/bin/bash的情况下,虽然source不成功,但是还是运行了source后面的echo语句。
但是紧接着我又试着运行了一下sh ./test.sh,这次屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
表示虽然脚本中指定了#!/bin/bash,但是如果使用sh 方式运行,如果source不成功,也不会运行source后面的代码。
为什么会有这样的区别呢?
junru同学作了解释
1. sh一般设成bash的软链
[work@zjm-testing-app46 cy]$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash
2. 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
3. 也就是说 /bin/sh 相当于 /bin/bash --posix
所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别
so,可以预想的是,如果第一行写成 #!/bin/bash --posix,那么脚本执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,
有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)
五. shell脚本的比较和逻辑运算符
1、数值
格式: test "num1" opr "num2"
[ "num1" opr "num2" ]
opr 取值: 相等:-eq 不等:-ne
大于:-gt 小于:-lt 【l是字母L的小写】
小于等于:-le 大于等于:-ge
2、字符串
格式: [ str1 opr str2]
opr取值:相等:= 不等:!=[ opr str ]
空串:-z 非空串:-n
3、文件
格式:[ opr file ]
opr取值:目录: -d 文件: -f
链接: -L 可读: -r
可写: -w 可执行: -x
文件非空: -s
4、逻辑运算符
逻辑与: -a 格式: [ condition1 -a condition2 ]
逻辑或: -o 格式: [ condition1 -o condition2 ]
逻辑否: ! 格式: [ ! condition ]
注意:[ 与condition 之间必须有空格,condition与] 之间也必须有空格
注意:-a -o 用在一个[]中间连接多个条件,而 && || 则用在多个[]之间,连接多个[]条件
非法:[ condition1 && condition2 ]
六. Makefile中的函数使用
示例:subst -- 字符串替换函数,用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO
$(subst a,the,There is a big tree) ----- 把“There is a big tree”中的“a”替换成“the”,返回结果是“There is the big tree”。
函数的调用语法
函数调用,很像变量的使用,也是以“$”来标识的,其语法如下:$( ) 或是 ${ }
这里,subst就是函数名,make支持的函数不多。a, the, There is a big tree是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。
函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。感觉很像一个变量,是不是?函数中的参数可以使用变量,为了风格的统一,函数和变量
的括号最好一样,如使用“$(subst a,b,$(x))”这样的形式,而不是“$(subst a,b,${x})”的形式。因为统一会更清楚,也会减少一些不必要的麻烦。
详见: http://blog.youkuaiyun.com/ljzcom/article/details/7886909
七.