晕…… 鸟哥写的那篇实在太好了不打算copy之二了。
鳥哥的 Linux 私房菜:
繁体中文:
http://linux.vbird.org/linux_basic/0340bashshell-scripts.php
简体中文:
http://www.oschina.net/bbs/thread/6563?lp=1
http://blog.csdn.net/baobao8505/archive/2006/09/21/1258645.aspx
http://www.linuxidc.com/Linux/2007-06/4767.htm
http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html
http://doc.linuxpk.com/3871.html
1.1 语法基本介绍
1.1.1 开头
脚本必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
符号#!的作用是告诉系统,它应该使用什么程序,来执行该文件。
在这个例子中我们使用/bin/sh来执行程序。
使脚本可执行:chmod +x file_name
运行./file_naem
-----------------------------------------
1.1.2 注释
使用# 作注释符
-----------------------------------------
1.1.3 变量
# 对变量赋值:
Variable="hello world"
# 现在打印变量a的内容:
echo "A is:"
echo $Variable
# 有时候变量名很容易与其他文字混淆,比如:
num=2
echo "this is the $numnd"
# 这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,
# 但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
echo "this is the ${num}nd"
# 俺建议大家用这种
# 等号两边不能有空格
# 在编写Shell程序时,为了使变量名和命令名相区别,建议所有的变量名都用大写字母来表示。
变量的只读性:
readonly 变量名
在任何时候,创建的变量都只是当前Shell的局部变量,所以不能被Shell运行的其他命令或Shell程序所利用,
而export命令可以将一个局部变量提供给Shell执行的其他命令使用,其格式为:
export 变量名
export 变量名=变量值 # 同时赋值
使用export说明的变量,在Shell以后运行的所有命令或程序中都可以访问到。
-----------------------------------------
1.1.4.1 环境变量
由export关键字处理过的变量叫做环境变量。
预定义变量:
HOME 用于保存注册目录的完全路径名。
PATH 用于保存用冒号分隔的目录路径名,Shell将按PATH变量中给出的顺序搜索这些目录,
找到的第一个与命令名称一致的可执行文件将被执行。
TERM 终端的类型。
UID 当前用户的识别字,取值是由数位构成的字串。
PWD 当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
PS1 主提示符,在特权用户下,默认的主提示符是#,在普通用户下,默认的主提示符是$。
PS2 在Shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,
或者当用户按回车键时Shell判断出用户输入的命令没有结束时,就显示这个辅助提示符,提示用户继续输入命令的其余部分,
默认的辅助提示符是>。
-----------------------------------------
1.1.4.2 预定义变量
预定义变量和环境变量相类似,也是在Shell一开始时就定义了的变量。所不同的是,用户只能根据Shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$符和另一个符号组成的,常用的Shell预定义变量有:
$# 位置参数的数量。
$* 所有位置参数的内容。
$? 命令执行后返回的状态。
$$ 当前进程的进程号。
$! 后台运行的最后一个进程号。
$0 当前执行的进程名。
其中,$?用于检查上一个命令执行是否正确。(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错。)
$$变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。
-----------------------------------------
1.1.4.3 参数
位置参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。
位置参数之间用空格分隔,Shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依次类推。
$0是一个特殊的变量,它的内容是当前这个Shell程序的文件名,
所以,$0不是一个位置参数,在显示当前所有的位置参数时是不包括$0的。
-----------------------------------------
1.1.4.4 参数置换
Shell提供了参数置换功能以便用户可以根据不同的条件来给变量赋不同的值。
参数置换的变量有4种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置类决定变量的取值,
它们的语法和功能分别如下:
a. 变量=${参数-word}: # -
实例:Var=$(1-888)
如果没有$1,即用888作用默认值替换
b. 变量=${参数+word}: # +
与第一种相反,如果参数有值,则使用word来替换参数的值
c. 变量=${参数?word}: # ?
实例:
Var=${1?"请你要输参数\$1"}
Var=${1?}
echo ${1}
判断是否有$1参数,有则继续,无则退出,并打印错误信息。
错误信息由?后边的字符串,无定义则打印默认
d. 变量=${参数=word}: # =
如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word,然后再用word替换参数的值。
注意。和A的相同,只是位置参数不能用于这种方式,因为在Shell程序中不能为位置参数赋值。
还有不少的。。。
-----------------------------------------
1.1.5 Shell命令和流程控制
1.1.5.1 命令:
shell脚本中可以使用任意的unix命令,常用的命令通常是用来进行文件和文字操作的。
常用命令语法及功能
echo "some text": 将文字内容打印在屏幕上
wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数
grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt
cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备
比如:输出每行第5个到第9个字符cut -b5-9 file.txt
cat file.txt: 输出文件内容到标准输出设备(屏幕)上
file somefile: 得到文件类型
read var: 提示用户输入,并将输入赋值给变量
sort file.txt: 对file.txt文件中的行进行排序
uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3
find: 搜索文件比如:根据文件名搜索find . -name filename -print
tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux
dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin
head file: 打印文本文件开头几行
tail file: 打印文本文件末尾几行
sed: Sed是一个基本的查找替换程序。该命令采用正则表达式(见参考)进行搜索。
不要和shell中的通配符相混淆。比如:将'a'替换为'_'
cat text.file | sed 's/a/_/' > new.file 替换每行第一个
cat text.file | sed 'y/a/_/' > new.file 替换所有
cat text.file | sed 'y/a/_/${n}' > new.file 替换每行第n(如果有的话)个
awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
cat file.txt | awk -F , '{print $1 "|" $3 }' 这里我们使用 ',' 作为字段分割符。
-----------------------------------------
1.1.5.2 概念: 管道, 重定向 和 反引号(backtick ` )
管道 (|) 将一个命令的输出作为另外一个命令的输入。
grep "hello" file.txt | wc -l
在file.txt中搜索包含有”hello”的行并计算其行数。
在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
> 写入文件并覆盖旧文件
>> 加到文件的尾部,保留旧文件内容。
反引号:将一个命令的输出作为另外一个命令的一个命令行参数。
find . -mtime -1 -type f -print
用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您
想将所有查找到的文件打一个包,则可以使用以下脚本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
命令A `命令B的结果作为前边命令的参数`
-----------------------------------------
1.1.5.3 流程控制
下回再贴,我得改改