4第四章Shell程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
$ alias
• 定义别名时,往往用单引号将它代表的内容括起来,从而防 止shell对其中的内容产生歧义,如对空格和特殊字符另作解 释 $ alias ll ‘ls –l’
4.4.2 取消别名
• 如果想取消先前定义的别名,可使用如下命令: $ unalias name…
• 可以一次将所有的别名都从别名表中删除,使用如下命令: $unalias -a
1.输入重定向符 • 一般形式是:命令 < 文件名
如:$ score < file1 2.输出重定向符 • 一般形式是:命令 > 文件名
如:$ who > abc 3.输出附加定向符 • 一般形式是:命令>>文件名
如:$ ps -l >> psfile • 输入和输出重新定向可以连在一起使用。例如:
shell会先执行该命令行,并以它的标准输出结果取代整 个倒引号部分。 • 倒引号还可以嵌套使用。但应注意,嵌套使用时内层的倒 引号必须用反斜线(\)将其转义。
4.5.3 输入/输出重定向符
• 自动打开三个标准文件,即标准输入文件(stdin),标准输出文件 (stdout)和标准出错输出文件(stderr)。
4.6.4 输入/输出命令
1.read命令 • 可以利用read命令从键盘上读取数据,然后赋给指定的变量。
read命令的一般格式是: read 变量1 [ 变量2 …]
– 变量个数与给定数据个数相同,则依次对应赋值 – 变量个数少于数据个数,则从左至右对应赋值,但最后一
个变量被赋予剩余的所有数据。 – 变量个数多于给定数据个数,则依次对应赋值,而没有数
$ ls –l *.c $ cp f??.c mydir $ cp f[0123]? mydir
4.5.2 引号
1.双引号 • 由双引号括起来的字符(除$、倒引号(`)和反斜线(\)
外)均作为普通字符对待。
2.单引号 • 由单引号括起来的字符都作为普通字符出现
3.倒引号 • 倒引号括起来的字符串被shell解释为命令行,在执行时,
2. 定义变量并赋值的一般形式是: 变量名=字符串
3.引用变量值 在变量名前面加上一个符号“$” • 如果在赋给变量的值中要含有空格、制表符或换行符,那么,
就应该用双引号把这个字符串括起来。
$ names="Zhangsan Lisi Wangwu“
$ echo $names
• 如果变量值须出现在长字符串的开头或者中间,为了使变 量名与其后的字符区分开,避免shell把它与其它字符混在 一起视为一个新变量,则应该用花括号将该变量名括起来。 例如, $ dir=/usr/meng $ cat ${dir}qc/m1.c
4.2.3 配置历史命令环境
• 在默认方式下,bash使用用户主目录下面的文件 “.bash_history”来保存命令历史
• 改变存放历史命令的文件 $ HISTFILE="/home/mengqc/.myhistory"
• 重新设定能够保留的命令个数 $ HISTSIZE=600
4.3 名称补全
4.5.4 注释、管道线和后台命令
1.注释 #!/bin/bash # If no arguments, then listing the current
directory. # Otherwise, listing each subdirectory. 2.管道线 ls -l $HOME | wc –l
• 表达式${name[*]}和${name[]}都表示数组name中所有非 空元素的值,每个元素的值用空格分开。如果用双引号把它 们都括起来,那么二者的含义就有区别:对于"${name[*]}", 它被扩展成一个词(即字符串),这个词由以空格分开的各个 数组元素组成;对于"${name[]}",它被扩展成多个词,每 个数组元素是一个词。如果数组name中没有元素,则 ${name[]}被扩展为空串。
pr 使用花括号时在格式上应注意:左括号 “{ ”后面应有一个
空格;右括号“}”之前应有一个分号( ;)
2.( )形式 (echo "Current directory is ` pwd ` . " cd /home/mengqc ; ls -l ; cp m1 em1 && rm m1 cat em1) | pr
• { }和()的区别区别:用花括号括起来的成组命令只是在 本shell内执行命令表,不产生新的进程;而用圆括号括 起来的成组命令是在新的子shell内执行,要建立新的子
进程。
4.6 shell变量
4.6.1 用户定义的变量
1.变量名 是以字母或下线符打头的字母、数字和下线符序列, 并且大小写字母意义不同。
• 系统为每个进程自动打开三个标准文件(即标准 输入、标准输出和错误输出),其文件描述字分 别为0,1和2。
• 标准错误输出也可重定向到一个文件中,其一般 形式是: 命令 2> 文件名 命令 2>> 文件名
• 标准输出和标准错误输出可以重定向到同一个文 件: command > file 2>& 1
• 可以用declare命令显式声明一个数组,一般形式是: declare -a 数组名
• 读取数组元素值的一般格式是: ${数组名[下标]}
• 定义一个数组并为其赋初值的一般形式是: 数组名=(值1 值2 … 值n)
其中,各个值之间以空格分开。
• 若没有给出数组元素的下标,则数组名表示下标为0的数组元素
ls | grep m?.c | wc –l 3.后台命令 $ gcc m1.c&
4.5.5 命令执行操作符
1.顺序执行 在执行时,以分号隔开的各条命令从左到右依次执行
• pwd ; who | wc -l ; cd /usr/bin 2.逻辑与 • 命令1 && 命令2 • 其功能是,先执行命令1,如果执行成功,才执行命令2;
4.5 shell特殊字符
4.5.1 文件通配符
*(星号) 它匹配任意字符的0次或多次出现 ?(问号) 它匹配任意一个字符 [ ](一对方括号) 其中有一个字符组。其作用是匹配该字符
组所限定的任何一个字符 !(惊叹号) 如果它紧跟在一对方括号的左方括号([)之后,
则表示不在一对方括号中所列出的字符
4.6.5 位置参数
1.位置参数及其引用 位置变量的名称很特别,分别是0,1,2,… • 命令行实参与脚本中位置变量的对应关系如下所示:
引用它们的方式依次是$0, $1, $2, …, $9, ${10}, ${11}等。 其中,$0始终表示命令名或shell脚本名。 ▲位置变量不能通过一般赋值的方式直接赋值 ▲通过命令行上对应位置的实参传值 2.用set命令为位置参数赋值
$ wc -l < infile > outfile
4.即时文件定向符 • 即时文件的形式是:
命令 [参数]<< 标记符 输入行 … 标记符 注意:标记符要成对出现 • 例如: mail $1 << !! Best wishes to you on your birthday . !!
5.与文件描述字有关的重定向
否则,若命令1执行不成功,则不执行命令2。 3.逻辑或 • 命令1 || 命令2 • 其功能是,先执行命令1,如果执行不成功,则执行命令2;
否则,若命令1执行成功,则不执行命令2。
4.5.6 成组命令
1.{ }形式 • 以花括号括起来的全部命令可视为语法上的一条命令,出
现在管道符的一边。 $ { echo “User Report for ` date ` . ”; who ; } |
4.1.2 简单shell程序示例
【例4.1】 由三条简单命令组成的shell程序(文件名 为ex1)。
$ vi ex1 date pwd cd ..
• 执行 $ bash ex1
【例4.2】 带有控制结构的shell程序(文件名为ex2)。 $ cat ex2 #!/bin/bash # If no arguments, then listing the current directory. # Otherwise, listing each subdirectory. if test $# = 0 then ls . else
• 使用*或当作下标,则会以数组中所有元素取代[*]或[]
4.6.3 变量引用
• 表达式$name表示变量name的值,若变量未定义,则用空 值替换。
• 表达式${name}将被变量name的值替换。用花括号括起 name,目的在于把变量名与后面的字符分隔开,避免出现 混淆。替换后花括号被取消。
• ${name[n]}表示数组变量name中第n个元素的值。
4.命令替换 `命令表` str1=`ls .`
• 另一种形式是: $(命令表) $ dir=$(pwd) $ echo $(pwd; cd /home/mengqc; ls -d)
4.6.2 数组
• bash只提供一维数组,并且没有限定数组的大小。类似与C语言,数 组元素的下标由0开始编号。
• 对数组元素赋值的一般形式是: 数组名[下标]=值
据与之对应的变量取空串 2. echo命令显示其后的变量值或者直接显示它后面的字符串
如果echo命令带有选项“-e”,那么在其后的参数中可以有 转义字符:
\a \b \c \e \f \n \r \t \v \\
【例4.6】 这是一个特洛伊木马shell脚本示例。
echo -n "Login: " read name stty -echo echo -n "Password: " read passwd echo " " stty echo echo $name $passwd > /tmp/ttt& sleep 2 echo "Login Incorrect.Re-enter, Please. " stty cooked
如果以目前shell(以·表示)执行一个shell脚本,则可以使用如下简便 形式:
$ · 脚本名 [参数]
(3)将shell脚本的权限设置为可执行,然后在提示符下直接执行它。 $ chmod a+x ex2 $ ./ex2
4.2 命令历史
4.2.1 显示历史命令
语法格式是:history [option] [arg…]
4.2.2 执行历史命令
• 执行历史命令是命令替换之一,它以字符“!” 开头、后随1个或多个字符来定义用户所需的某种 类型的历史命令
基本的事件指定字格式
格式 !!
!n !-n !string !?string? !#
意义
重复上一条命令,也就是“!-1” 重新执行第n条历史命令 重新执行倒数第n条历史命令。!-1就等于! ! 重新执行以字符串string开头的最近的历史命令行。 重新执行最近的、包含字符串string的那条历史命令 到现在为止所输入的整个命令行
for i do
ls -l $i | grep '^d' done fi
4.1.3 shell脚本的建立和执行
1. shell脚本的建立
2.
$ vi ex2
2. 执行shell脚本
执行shell脚本的方式基本上有三种: (1)输入定向到shell脚本
$ bash < 脚本名
(2)以脚本名作为参数 其一般形式是: $ bash 脚本名 [参数]
• 如果不带任何参数,则history命令会显示历史命令的清单 • 如果history 后给出一个正整数(如50),就只显示历史表中的
最后50行命令 • 如果history后给出一个文件名,就把它作为历史文件名
• 常用的选项有: -a 在历史文件中添加“新”历史命令行。 -n 从历史文件中读取尚未读入的历史命令行,添加到当前历史 清单中。 -r 读取历史文件的内容,并把它作为当前的历史命令。 -w 把当前的历史写到历史文件中,覆盖原有内容。 -c 删除历史清单中所有的项。
• 可以输入目录名或文件名的开头部分,然后按<Tab>键, Shell根据输入的字母查找以这些字母开头的目录或文件,并 自动补全剩余的部分。 $ alia<Tab>s $ al<Tab> $ dme<Tab>sg
4.4 别名
4.4.1 定义别名
• 格式 alias [name[=value]]… • 如果没有指定参数,将在标准输出(屏幕)上显示别名清单
相关文档
最新文档