1. bash基本语法
下面看一个简单的shell文件(HelloWorld.sh):
#!/bin/bash
#This is an example
echo Hello World
(1)“#!”是说明这个文件类型的,Linux系统根据“#!”及其后面的字符串确定该文件的类型,/bin/bash表名该文件是一个bash程序,需要由/bin目录下的bash程序来解释执行。
(2)“#”是bash文件的注释;echo是回显命令(标准输出;Bash程序中绝大部分语句结束时没有分号。
(3)执行bash程序:sh HelloWorld.sh 或者./HelloWorld.sh(需要有可执行权限)。
bash shell文件头文件常见有:
1 #!/bin/sh
2 #!/bin/bash
3 #!/usr/bin/perl
4 #!/usr/bin/tcl
5 #!/bin/sed -f
6 #!/usr/awk -f
详见:[http://blog.csdn.net/cjsycyl/article/details/7927727]
2. bash变量
注:bash中的变量是不能含有保留字,不能含有“-”等保留字符,也不能含有空格。
在bash中,变量是不需要提前定义的,一般使用变量的第一条语句是赋初值,若不赋初值,默认为NULL。
例子:
#!/bin/bash
#This is an example
STR=”Hello World”
echo $STR
(1)变量赋值时,“=”号左右两边都不能有空格。
(2)除了变量赋值和在for语句循环头中,bash*变量*在使用时都需要加“$”。
(4)Bash程序是在一个新的进程中运行,该程序中的变量命名,赋值和使用不会影响其他进程或者原始shell变量已存在的值(相当于C++中的局部变量作用域?)
(5)以单引号括起来的变量将不再被解释为变量,如‘
STR′将被解释为一个字符串。更为标准的变量引用方式是“
{变量名}”,例子中是省略了{}的简化写法。
(6)bash变量没有类型的分别,一个变量可以被定义为字符串,也可以再被定为为整数,取决于变量的用途。
例子(变量的运算):
#!/bin/bash
x=1999
let "x=$x+1"
echo $x #输出2000
x=`expr $x+1`
echo $x #输出2000+1
x="Hello"$x
echo $x #输出Hello2000+1
变量加减:(亲测实例)x=$(( $x + 1 ))
注意首句路径格式等要写对;
(7)在比较操作上,整数变量和字符串变量不同:
如:
比较字符串变量a和b是否相等就写作:if [
a=
b]
比较整数变量a和b是否相等写作:if [
a−eq
b]
(8)除了整数和字符串之外,bash变量还可以作为文件变量操作。bash中没有浮点数运算。
其中,file,file1,和file2代表文件路径
3.函数
function my_funcname {
code block
}
(1)左边的写法“{” 之前要有空格,否则会有错误:syntax error near unexpected token `echo’
(2)函数的参数并不需要在定义时就指定,只需要通过bash保留变量
1,
2……来引用就可以了。
(3)函数的返回值可以用return语句来制定返回一个特定的整数,如果没有指定,则返回最后一条语句的执行结果(成功返回0,失败返回错误代码)。函数的返回值通过“$?”保留字来获得。BASH要求返回值必须为一个整数,不能有return语句返回字符串变量。
例子:square.sh
#!/bin/bash
square(){
let "res=$1*$1"
return $res
}
square $1 #$1表示第一个实参 5
result=$?
echo $result
exit 0
执行:sh funtest.sh 5 返回:25
4. 提取文件名和目录名
参考链接:(http://blog.csdn.net/ljianhui/article/details/43128465)
(1)使用
其实
{}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的’/’或’.’。也就是说,上面的使用方法只是它使用的一个特例。
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。
*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。
(2)basename和dirname
示例一
[root@web ~]# basename /usr/bin/sort
sort
[root@web ~]# dirname /usr/bin/sort
/usr/bin
[root@web ~]#
5.for循环
格式:for arg in [list]
参考链接:http://blog.csdn.net/xinyuwuxian/article/details/8912204
#这是一个基本的循环结构. 它与C语言中的for循环结构有很大的不同.
[html] view plain copy
for arg in [list]
do
command(s)...
done
#在循环的每次执行中, arg将顺序的访问list中列出的变量.
for arg in "$var1" "$var2" "$var3" ... "$varN"
# 在第1次循环中, arg = $var1
# 在第2次循环中, arg = $var2
# 在第3次循环中, arg = $var3
# 在第N此循环中, arg = $varN
# 在[list]中的参数加上双引号是为了阻止单词分割.
注:list中的参数允许包含通配符,如果do和for想在同一行中出现, 那么在它们之间需要添加一个分号.
for arg in [list] ; do
#!/bin/bash
for planet in Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto
do
echo $planet
done
echo "---------------------------------------------------"
for planet in "Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto"
do
echo $planet
done
exit 0
结果:
root@ubuntu:~/resource/0510# ./test1
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto
---------------------------------------------------
Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto
root@ubuntu:~/resource/0510#
每个[list]中的元素都可能包含多个参数. 在处理参数组时, 使用set命令来强制解析每个[list]中的元素, 并且将每个解析出来的部分都分配到一个位置参数中.
#!/bin/bash
for planet in "Mercury 36" "Venus 67" "Earth 93" "Mars 142" "Jupiter 483"
do
set -- $planet
echo "$1 $2,000,000 miles from the sun"
done
exit 0
结果:
root@ubuntu:~/resource/0510# ./test1
Mercury 36,000,000 miles from the sun
Venus 67,000,000 miles from the sun
Earth 93,000,000 miles from the sun
Mars 142,000,000 miles from the sun
Jupiter 483,000,000 miles from the sun
root@ubuntu:~/resource/0510#
6.cat命令使用
cat主要有三大功能:
1.一次显示整个文件。
catfilename2.从键盘创建一个文件。
cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件: $cat file1 file2 > file
参数:
-n 或 –number 由 1 开始对所有输出的行数编号
-b 或 –number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 –squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 –show-nonprinting
例:
#把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -n textfile1 > textfile2
#把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
cat -b textfile1 textfile2 >> textfile3