1、shell基本元素
a、#! /bin/bash 必须的,指出shell类型(ash,bash,ksh,csh,zsh)
b、# 注释
c、变量
d、控制
2、创建和执行脚本文件
a、用任何编辑器比如vi在文本文件中编写脚本,以.sh为后缀名保存文件。
b、将文件赋予可执行的权限
c、执行脚本命令:
1)bash 脚本文件
2)./脚本文件
注意:文件开头指定一个或多个解释脚本程序的shell,如 #!/bin/bash
如果指定,注意/bin不要漏了“/”,否则用./方式执行会找不到路径。
不指定的话一般默认以/bin/sh执行shell脚本
3、shell的一般结构
shell类型
函数
主过程
一般模板 abc.sh
#! /bin/bash shell类型
#a simple shell script example
#a function
sayhello() 函数
{
echo "Enter Your name:"
read name 读取来自键盘输入的变量
echo "Hello $name"
}
echo "programme starts here..." 主过程
sayhello
echo "programme ends."
4、shell中的特殊符号
a、注释符#
除了#!/bin/bash里的#特殊
b、美元符 $
变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来
c、单引号
被引起的字符全部做普通字符,即全部原样
echo ‘my $SHELL’
d、双引号
引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
e、倒引号(数字1键旁边的那个键)
引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
`pwd` 即pwd命令的执行结果
$LOGNAME 系统变量
区别下面几句:
echo ‘my home is $HOME’
echo “my home is $HOME”
echo `my home is $HOME`
echo “my home is `pwd`”
echo ‘my home is `pwd`’
f. 反斜线
反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。、
echo “Filename is N0\$\`”
5、shell中部分内部变量
$# 传送给shell程序的位置参数的数量
$? 最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0 shell程序的名称
$* 调用shell程序时所传送的全部参数的单字符串, “参数1”“参数2”…形式保存的参数
$n 第n个参数
6、条件判断命令
test n1 -参数 n2 (或 –参数 表达式) [ n1 -参数 n2 ]
真返回0,假返回1。
参数:
-lt 小于
-le小于等于
-gt 大于
-ge 大于等于
-eq 等于
-ne 不等于
test语句的等价形式[ 1 –lt 4 ]
可用中括号代替test,把表达式括起来实现判断
注意表达式与中括号间有空格。
test 1 –lt 4 #判断1<4
echo $? #结果为0
7、文件测试
-f 存在且是普通文件
-d 存在且是目录
-s 存在且字节数大于0
-r 存在且可读
-w 存在且可写
-x 存在且可执行
如:test -d “mydoc” [ -d "mydoc" ]
判断mydoc是否是目录
eg:检测从命令行输入的文件是否存在
if [ $# -ne 1 ]
then
echo "usage -$0 file-name"
exit 1
fi
if [ -f $s1 ]
then
echo "$1 file exit"
else
echo "$1 file does not exit"
8、字符串测试
=: 等于则为真
!=:不相等则为真
-z字符串:字符串长度为零则为真
-n字符串:字符串长度不为零则为真
-a 并且 -o 或者 !非
与或非
&& || !
-a -o !
9、命令结果重定向
0 stdin 标准输入
1 stdout标准输出
2 stderr标准错误
输出重定向到文件file,终端上只能看到标准错误:
#命令 >file
错误重定向到文件file ,终端上只能看到标准输出:
#命令 2>file
标准输出和标准错误都重定向到file,终端上看不到任何信息:
#命令 >file 2>&1
(等于#命令 1>file 2>&1)
10、屏蔽任何命令的输出
cp /etc/my.conf >/dev/null 2>&1
/dev/null 空设备
此句命令的结果是:
cp命令没有目标文件,应该输出错误。
2>&1表示错误重定向指向标准输出。
>/dev/null又使标准输出重定向到空,就是不要输出信息
即:一个错误的命令执行,什么功能都不实现,且没有任何信息或错误提示输出。
1)command >file 2>file
2)command >file 2>&1
有什么区别?
1)的写法,stdout和stderr都直接送到file中, 会出现两个同抢占file的管道,file会被打开两次,stdout和stderr输出的信息会互相覆盖。
2)的写法将stdout直接送向file, stderr继承1的管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,常用command > file 2>&1 这样的写法。
11、IO重定向
$ cat < file > file 文件內容会被洗掉
$ cat file 此处会没有内容
stdout、stderr 的管道先准备好才会从 stdin读内容
> file 会先清空 file,然後才读进 < file ,但此时file已被清空,
因此再重定位读进file的为空
最后cat显示的file就成空了
12、计算命令的开始到结束之间的时间
time find /etc -name "passwd" 2>/dev/null