1.shell脚本格式
第一行 #! /bin/shell (或者其他shell的可执行文件地址)。
第一行 指定了执行这个shell脚本呢所用的shell,在一个shell中可以调用别的shell来执行脚本。
注释采用 # (第一行是个例外),在#后面的内容不被处理
脚本文件中可以使用多个命令,多个命令可以放在一行,中间需要加 ; 分号隔开。 也可以直接放在不同的行。
2. 输出信息
经常使用echo来输入内容, echo 直接输出它后面跟着的一行内容,其中可以使用变量,常量,或者命令的结果等。比如echo hello, how are you!
则结果输出echo后面的一行内容: hello, how are you!。
在echo后面的字符串中成对单引号或者成对双引号,则被忽略,比如 jason@Ubuntu:~$ echo "how are you" 结果输出 how are you,
如果要在输出中显示单引号或者双引号,则可以在成对单引号中间使用双引号(可以多个),注意只能在外侧有一对单引号; 或者在成对双引号中间使用单引号(可以多个),注意只能在外侧有一对双引号。jason@Ubuntu:~$ echo "how' are you" 输出 how' are you
输出单引号或者双引号,可以使用 \ 转义。 \' \"
3.脚本文件权限
默认touch创建文件的权限为 -rw-r--r--, 没有执行权限,要使得shell脚本可执行,可以使用 chmod u+x filename
执行脚本的时候,使用的shell在PATH中可以找到,但该脚本文件的路径在PATH中一般没有,所以一般使用 脚本路径名/脚本文件名
4.使用变量
使用在shell脚本执行环境下可见的变量,用$变量名,如 echo UID:$UID, shell脚本默认在$后的是变量,需要进行解析,如果解析不到,则不进行输出。如echo $15,想要输出15美元,但只输出5. 如果需要输出$符号,则使用\$ 转义字符。
shell允许在自己的脚本中定义和使用用户变量,用户变量可以是由不超过20个字符的字母、数字或下划线组成的文本字符串,用户变量区分大小写。值通过等号赋值给用户变量,在变量、等号、变量值之间不允许空格存在。
每次引用变量时,它会生成当前赋值给他的那个值,用美元符号引用变量,变量之间相互赋值也需要使用美元符号$,如 val1='hello young man' val2=$val1
没有美元符号$,shell将变量名理解为普通的文本字符串。
linux中反引号(在键盘上 ~一个位置)的使用: 反引号允许将shell命令的输出赋值给变量。
testing=`date`, 则date命令的输出结果赋值给testing变量。
jason@Ubuntu:~$ date +%y%m%d
131201
today=`date +%y%m%d`
echo $today
131201
5.重定向输入输出
重定向输出:基本命令是通过一条命令将输出发送到文件中,使用>号。
$ date > testfile
重定向操作符创建了文件testfile(并且使用了默认的umask),并且将date的输出重定向到了testfile文件中。如果输出文件已经存在,则重定向操作会用新的文件数据重写已经存在的文件。如果需要在文件后面继续添加内容,而不是重写,可以使用 >> , $ id >> testfile
重定向输入:将一个文件的内容重定向到一条命令中,使用 < 号。
command < filename
$wc < testfile
wc命令对数据中的文本计数,默认情况下生成3个值,文本的行数; 文本的单词数; 文本的字节数
6.管道
管道可以实现进程之间的通信、数据交换,可以将一个命令的输出发送到另一个命令的输入。管道使用 | 竖线来实现。例如:rpm -qa实现列出系统中所有安装的软件包。
如果要求,输出的软件包列表排序后友好的显示,可以使用 rpm -qa | sort |more
如果要求,输出的软件包列表排序后输出到文件中,可以使用 rpm -qa | sort | > testfile
7.shell中使用数字运算
方法以一:使用方括号(只适用于bash shell)。在bash shell中,为一个变量指定一个数学值时,可以使用美元符号或方括号( $[operation] )来实现,如:
$ var1=$[1+5]
$echo var1
6
$var2=$[$var1*3]
$echo var2
18
使用中,由于加减乘数号在方括号中,bash shell不会将他们视为特殊符号,而是认为数学表达式符号。
这种方法的缺陷是只能进行整数的运算。浮点数不行。
方法二:浮点解决方案,使用bc (在bash shell中的计算器)bash 计算器bc实际是一种编程语言,它允许在命令行中输入浮点表达式,然后解释表达式并计算它们。在bash shell中进入bc,直接在命令行中输入bc即可。推出bc,使用quit。
jason@Ubuntu:~$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale=4 //scale变量的默认值为0,在设置scale的值之前,结果的小数位只显示0位,即只显示整数部分; 设置为4,显示4位小数。
3.44/5
.6880
2+4
6
在脚本中使用bc计算:
使用反引号运行bc命令,并且把结果赋值给一个变量,格式为: variable=`echo "options; expression" | bc`
jason@Ubuntu:~$ var1=`echo "scale=4; 3.44/5"|bc` //将命令 echo "scale=4; 3.44/5"的输出,作为输入通过管道传给 bc进程,得出结果,反引号赋值给变量var1.
jason@Ubuntu:~$ echo $var1
.6880
#!/bin/bash
#test bash shell
var1=100
var2=45
var3=`echo "scale=4; $var1/ $var2"|bc`
echo var3 is: $var3
这种方法如果要计算的表达式过多,也会比较麻烦,可以使用内置输入重定向
{ 内置输入重定向允许在命令行中而非文件中为输入重定向指定数据!内置输入重定向是使用 <<连接命令和数据, command << datas,出了这个符号,还必须指定一个文本标记来说明输入输出数据的开始和结尾,该文本标记可以使用任何字符串,但在数据的开头和结尾处必须相同。
command << marker
data1
data2
....
marker
}
使用格式为:{这里是在文件中使用重定向? 只是将数据通过重定向给bc命令,而不是将文件数据给bc命令}
variable=`bc << EOF
options
statements
...
expressions
...
EOF
`
#!/bin/bash
#test bash shell
var1=100
var2=45
var3=55.2
var6=`bc << EOF
scale=4
a=($var1/$var2)
b=($var3*$var3)
a+b #注意此处直接使用 a, b,而不是使用 $a, $b,是因为这是在bc的使用范围内
EOF
`
echo result is: $var6
8.shell 脚本的退出状态
在一条shell命令之后,调用ehco $? 返回上一条命令的退出状态,状态0表示成功运行结束,大于0的整数表示出现错误。
可以在shell脚本中shell指令后 加 exit 状态号 来改变该shell指令的退出状态。
xxxxx指令
exit 退出状态号
则该shell脚本以指定的号退出。