shell 脚本是一个包含命令序列的文本文件。当运行文件(或脚本)时,将执行该文件中包含的命令。术语 shell 仅指与 Linux内核通信所使用的特定命令行用户界面。目前有多个不同的 shell ,其中包括 C shell (csh) 、 Korn shell(ksh) 、 Bourne shell (sh) 和 Bourne-Again shell (bash) 。 shell本身就是一个从
脚本文件中的第一行可用于指定使用哪个 shell 来运行该脚本。
#!/bin/sh 制定使用sh
vi hello
#!/bin/sh
echo "hello!"
保存,加可执行权限 chmod u+xhello ./hello --->hello!
简单的shell程序写好了,运行->在终端上打印hello!
shell编程保留字:
$shell变量名的开始,如$var
| 管道,将标准输出转到下一个命令的标准输入
# 注释开始
& 在后台执行一个进程
? 匹配一个字符
* 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)
$- 使用set及执行时传递给shell的标志位
$! 最后一个子进程的进程号
$# 传递给shell script的参数个数
$* 传递给shell script的参数
$@ 所有参数,个别的用双引号括起来
$? 上一个命令的返回代码
$0 当前shell的名字
$n (n:1-) 位置参数
$$ 进程标识号(Process Identifier Number, PID)
>file 输出重定向
>fiile 输出重定向,append
双引号,单引号,单引号
例如:
s=date #设置变量
echo "$s" --->date #引用变量
echo '$s' --->$s
echo `$s` --->三 5月 9 18:17:56 CST 2007
&& 命令 格式command1&&command2
当command1执行成功以后才执行command2,例如当需要将当前目录一个文件拷贝到另一个目录,拷贝成功后删除原来的文件,如果写成
cpxxx.xxx /aaa/aaa/
rm xxx.xxx
这样不管拷贝是否成功都会将源文件删除,但是写成
cp xxx.xxx /aaa/aaa/ && rmxxx.xxx
就不会出现上述情况
还有希望在拷贝成功后给出提示信息也可以
cp xxx.xxx /aaa/aaa/ && echo "copysuccessful"
||命令 commanda1 || command2
当command1执行失败的时候才执行command2
如:cp xxx.xxx /aaa/aaa/ || echo "copy failed"
输入read
read var
此时在终端输入abc按回车结束输入
echo $var ---> abc
管道 | 经前一个的输出作为后一个的输入
如ls | sort
ls列出当前目录文件,sort对ls的结果进行排序
trap命令:
信号值: 含义
0 shell退出(各种正常退出,包括文件结束即Ctrl-D.)
1 挂断
2 中断(DEL)键
3 退出,导致突然撤出内核
9 强迫中止(不能捕获或不执行)
15 软件结束(中断)信号,由kill产生的缺省信号
使用方法:
忽略信号的命令格式为: trap '' 信号序列
重新定义信号动作的命令格式为: trap命令序列 信号序列
恢复信号原有缺省动作的格式为: trap 信号序列
Trap 命令常用于程序被中断时删除临时文件。如:
trap 'rm -f $new $old;exit 1' 1 215 (当1 2 15 中断信号发生时,执行'rm -f$new $old;exit 1'命令序列)。
trap 常用于保护程序不会由于中断信号引起异常退出。
如: trap '' 1 2 15 (cp xxxx xxxx拷贝过程中不会由于 1 2 15 中断信号而造成拷贝异常退出。)
在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体的值来替换。 实际上trap中的命令序列将被读取两次的,一次是建立trap时,一次是调用trap时,因此最好使用单引号来保护,这样变量仅在程序执行时才被赋值。
shift 将参数左移 1个 同时参数个数$#将减一,若参数个数大于9个时,可用shift命令实用9个以后的参数
set 可重新设置参数
如set `date`
echo $1----->四
执行date命令看看输出就知道了:)
test 测试 也可[ xxxx ] (!注意空格)
read var 输入hello
test "$var" = "hello"或[ "$var = "hello" ]
使用$?查看结果:如果表达式为真,返回值会为0,如果表达式为假,返回值为1。
文件或终端读取命令、解释这些命令并通常执行其他命令的命令。
Bourne-Again shell 合并了上述其他 shell的特性,本文就使用该脚本进行演示。 脚本文件中的第一行可用于指定使用哪个 shell 来运行该脚本。
#!/bin/sh
vi hello
#!/bin/sh
echo "hello!"
保存,加可执行权限 chmod u+xhello
简单的shell程序写好了,运行->在终端上打印hello!
shell编程保留字:
$shell变量名的开始,如$var
| 管道,将标准输出转到下一个命令的标准输入
# 注释开始
&
?
*
$-
$! 最后一个子进程的进程号
$# 传递给shell script的参数个数
$* 传递给shell script的参数
$@ 所有参数,个别的用双引号括起来
$? 上一个命令的返回代码
$0 当前shell的名字
$n (n:1-) 位置参数
$$ 进程标识号(Process Identifier Number, PID)
>file 输出重定向
>fiile 输出重定向,append
双引号,单引号,单引号
例如:
s=date
echo "$s"
echo '$s'
echo `$s`
&& 命令 格式command1&&command2
当command1执行成功以后才执行command2,例如当需要将当前目录一个文件拷贝到另一个目录,拷贝成功后删除原来的文件,如果写成
cpxxx.xxx
rm xxx.xxx
这样不管拷贝是否成功都会将源文件删除,但是写成
cp xxx.xxx /aaa/aaa/ && rmxxx.xxx
就不会出现上述情况
还有希望在拷贝成功后给出提示信息也可以
cp xxx.xxx /aaa/aaa/ && echo "copysuccessful"
||命令 commanda1 || command2
当command1执行失败的时候才执行command2
如:cp xxx.xxx /aaa/aaa/ || echo "copy failed"
输入read
read var
此时在终端输入abc按回车结束输入
echo $var ---> abc
管道 | 经前一个的输出作为后一个的输入
如ls | sort
ls列出当前目录文件,sort对ls的结果进行排序
trap命令:
信号值:
0
1
2
3
9
15
使用方法:
忽略信号的命令格式为:
重新定义信号动作的命令格式为:
恢复信号原有缺省动作的格式为:
Trap 命令常用于程序被中断时删除临时文件。如:
trap 'rm -f $new $old;exit 1' 1 215
trap 常用于保护程序不会由于中断信号引起异常退出。
如: trap '' 1 2 15
在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体的值来替换。 实际上trap中的命令序列将被读取两次的,一次是建立trap时,一次是调用trap时,因此最好使用单引号来保护,这样变量仅在程序执行时才被赋值。
shift 将参数左移 1个 同时参数个数$#将减一,若参数个数大于9个时,可用shift命令实用9个以后的参数
set 可重新设置参数
如set `date`
echo $1----->四
执行date命令看看输出就知道了:)
test 测试 也可[ xxxx ] (!注意空格)
read var
test "$var" = "hello"或[ "$var = "hello" ]
使用$?查看结果:如果表达式为真,返回值会为0,如果表达式为假,返回值为1。