第4章 Linux下的shell编程
§4 shell 的常用语句
逻辑运算符 &&(与)和 ||(或) ( (
条件1 条件2 条件1 条件2 条件 && 条件 或 条件 -a 条件 条件1 条件2 条件1 条件2 条件 || 条件 或 条件 -o 条件 ! 求反 : 空命令(表示什么也不做),条件为真,退出值 空命令(表示什么也不做),条件为真, ),条件为真 为0 true 条件总为真,退出值为0 条件总为真,退出值为 false 条件总为假,退出值不为0 条件总为假,退出值不为
§2 shell 变量
位置变量(位置参数) 位置变量(位置参数)
命令行: 参数1 参数2 参数3 命令行:命令名 参数 参数 参数 …… 位置变量: $1 $2 $3 …… $9 位置变量:$0 例:
#!/bin/bash # 打印第一个参数,首先检查是否有一个参数: 打印第一个参数,首先检查是否有一个参数: if [ "$#" -eq 0 ]; then echo "usage: $0" else echo " The argument is $1 " fi
§2 shell 变量
数组
只提供一维数组, 只提供一维数组,但不限制数组的大小 数组下标从0开始 数组下标从 开始 数组赋值
数组名[下标 值 数组名 下标]=值 下标 数组名={值 数组名 值1 值2 值3 ……}
取消数组定义
unset week[4]:取消week中第 个元素的定义 :取消 中第4个元素的定义 中第 unset week:取消整个 :取消整个week数组的定义 数组的定义
§3 shell 操作符
运算符
算术运算符:+,-, , , , 算术运算符:+,-,*,/,>>,<< :+,-, 逻辑运算符: 逻辑运算符:&&,||,! , ,! 比较运算符:= (-eq), (-gt), (-lt), 比较运算符:= (-eq),> (-gt),< (-lt), != (-ne),<= (-le),>= (-ge) , , 文件操作符: , , , , 数字, 文件操作符: -x,-f,-r,-w,-s 数字,……
§2 shell 变量
从键盘读取变量输入值
read varname 把读入的值依次赋给各变量, 把读入的值依次赋给各变量,所有剩余的值赋给最 后一个变量 例: #!/bin/bash # 取得使用者的名字,打印出问候语 取得使用者的名字, echo -n "Enter your name:" read user_name echo "Hello $user_name! "
§2 shell 变量
环境变量
shell 在开始执行时就定义了一些与系统的工作环 境有关的变量 例:
HOME:用户主目录的绝对路径名 : PATH:命令的搜索路径 : PS1(PS2):一(二)级提示符 ( ):一 ): PWD:当前目录的绝对路径名 :
§2 shell 变量
LOGNAME:你的注册名 : SHELL:当前使用的 shell : TERM:你的终端类型 :
下的shell编程 第4章 Linux下的 章 下的 编程
§1 shell 的基本概念 §2 shell 变量 §3 shell 操作符 §4 shell 的常用语句
§1 shell 的基本概念
命令的别名
定义别名: 命令名=’原命令名 原命令名’ 定义别名:alias 命令名 原命令名’
说明: 说明:“=” 两边不能有空格 例:$ alias md=’mkdir’
§4 shell 的常用语句
if (条件分支语句) 条件分支语句 语句)
语法格式
if 条件测试命令 then 命令组1 命令组 else 命令组2 命令组 fi
§4 shell 的常用语句
if 语句的例子 语句的例子 的例子1
#!/bin/bash if test -f /etc/foo then # 若文件存在,拷贝文件,然后打印出一个信息 文件存在,拷贝文件, cp /etc/foo . echo "Done." else # 若文件不存在,打印出一个信息,然后离开 文件不存在,打印出一个信息, echo "This file does not exist." exit fi
§3 shell 操作符
`(反引号) (反引号)
反引号括起来的字符串被 shell 解释为命令行 shell 先执行该命令,并以其标准输出结果取代整个 先执行该命令, 反引号部分 例 $ echo " current directory is `pwd` " $ today=`date` $ echo Today is $today
§3 shell 操作符
'(单引号) (单引号)
由单引号括起来的字符均作为普通字符对待 例 #!/bin/bash x=5 # 设定 x 初值为 5 # 使用双引号 echo "Using double quotes, the value of x is: $x" # 使用单引号 echo 'Using forward quotes, the value of x is: $x'
§4 shell 的常用语句
case (多路分支语句) 多路分支语句)
语法格式
case 变量 in 模式 1) 命令组1 命令组 ;; 模式 2) 命令组2 命令组 ;; … *) 命令组 esac
访问环境变量
$环境变量名 环境变量名
删除环境变量
unset 环境变量名
§2 shell 变量
预定义的变量(特殊变量、内部变量) 预定义的变量(特殊变量、内部变量)
shell 在开始执行时就定义的变量 用户不能重新定义这些变量 例:
$?:上一条命令执行后的返回值 : $$:当前进程的进程号 : $!:上一个后台命令对应的进程号 : $#:命令行上参数的个数(不包含 shell 脚本名) :命令行上参数的个数( 脚本名)
§4 shell 的常用语句
文件测试
test -r file:若 file 存在且可读,则为真 存在且可读, : test -w file:若 file 存在且可写,则为真 存在且可写, : test -x file:若 file 存在且可执行,则为真 存在且可执行, : test -e file:若 file 存在,则为真 file: 存在, test -s file:若 file 存在且不是空文件,则为真 存在且不是空文件, : test -f file:若 file 存在且是普通文件,则为真 存在且是普通文件 文件, : test -c file:若 file 存在且是字符设备文件,则为真 存在且是字符设备文件 文件, : test -b file:若 file 存在且是块设备文件,则为真 存在且是块设备文件 文件, : test -d file:若 file 是一个目录,则为真 是一个目录, :
§4 shell 的常用语句
注:test的另外写法 的另外写法
if test -f /etc/foo then … if [ -f /etc/foo ]; then … 注:[] 内左右两边要留空格
§4 shell 的常用语句
if 语句的例子 语句的例子 的例子2
#!/bin/bash x=5 y=10 if [ "$x" -eq 5 ] && [ "$y" -eq 10 ]; then echo "Both conditions are true." else echo "The conditions are not true." fi
§1 shell 的基本概念
shell 脚本的运行方式
1、$ chmod u+x ./simple 、 $ ./simple 2、$ sh simple 、 3、$ sh < simple 、 4、$ . simple 、
§2 shell 变量
使用时“现定义、现赋值” 使用时“现定义、现赋值” 分类
§3 shell 操作符
引号
" (双引号) 双引号)
由双引号括起来的字符, 由双引号括起来的字符,除 $、反引号 ` 和反斜线 \ 、 保留其特殊功能外, 保留其特殊功能外,其余均作为普通字符对待 例 $ mkdir hello world $ mkdir "hello world" $ x=5 $ echo "The value of variable x is $x"
§4 shell 的常用语句
注释
开头,第一行( 以 “#” 开头,第一行(“#!/bin/bash”)除外 )
echo(显示字符串) (显示字符串)
命令格式:echo [-n] 字符串 命令格式: 例
$ echo hello $ echo "hello $ echo $hello world world"
取消别名: 取消别名:unalias 命令名
例:$ unalias md
§1 shell 的基本概念
shell 脚本(shell 程序) 脚本( 程序)
包含一个或多个 shell 命令的文件 一个简单的 一个简单的 shell 程序 simple
#!/bin/bash # 这个程序将打印“Hello World”到屏幕上 这个程序将打印“ 到屏幕上 echo "Hello World"
Байду номын сангаас
§1 shell 的基本概念
更有用的程序
操作方式1 操作方式 $ mkdir trash $ mv * trash $ rm -rf trash $ rmdir trash 操作方式2 操作方式 #!/bin/bash mkdir trash mv * trash rm -rf trash rmdir trash echo "Deleted all files!"
Linux实验报告(实验四) shell编程实验
实验四 shell编程实验(二)班级:姓名:学号:上机时间:年月日任课教师:实验教师:实验成绩:一、实验目的综合Linux常用命令和vi编辑器的使用,熟练掌握shell脚本编程。
二、实验注意事项实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。
要求每个同学登录后系统后,要在自己的家目录下创建一个属于自己的子目录(以自己(拼音)名字或学号)。
以后所有工作都要在自己的目录内进行。
建议以后的实验都在同台计算机上做,这样可以保持连续性。
三、实验内容1. 编写一个脚本,求斐波那契数列的前10项及总和。
num1=1num2=1echo -n “$num1+$num2”sum=2for((i=1;i<=8;i++))dotmp=$(expr $num1 + $num2)echo -n “+$tmp”((num1=num2))((num2=tmp))sum=$(expr $sum + $tmp)doneecho “=$sum”2.编写一个脚本,求一个数的逆序。
echo -n please input num:read numecho -n The num iswhile [ $num -gt 0 ]dosd=$(($num % 10))echo -n "$sd"num=$(($num/10))doneecho3.设计一个Shell程序,在用户主目录下建立一个userdata目录,在此目录下再建立5个目录,即user1~user5,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。
(注意:最后删除自己所建立的目录,恢复原样,以便后面同学做此实验)mkdir -m 754 /home/userdatai=1temp=/home/userdata/userwhile[ $i -le 5 ]domkdir -m 754 $temp$ilet”i=i+1”#done4.用Shell编程,判断一文件是不是普通文件,如果是将其拷贝到/home/student/test 目录下,用命令查看test目录内容,最后再删除test目录。
Linux中的shell与shell命令
s h e l l与s h e l l命令本章主要内容:shell基本功能及种类shell基本概念I/O重定向与管道shell的启动基本shell命令3.1shell基本功能与基本概念3.1.1shell基本功能shell是用户和Linux内核之间的接口程序。
shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。
shell一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构shell具有以下基本功能:1.命令解释执行2.文件名替换.3.输入输出重定向4.连通管道建立5.系统环境设置6.shell编程3.1.2字符与保留字1.字符(1)白空格(2)通配符*:代表从它所在位置开始的任何字符串。
?:代表它所在位置上的任何单个字符。
[]:代表一个指定范围的字符。
方括号中的字符范围可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间的连字符“-”组成。
通配符模式串意义* 当前目录下所有文件名,但不包括.开头的文件。
例如abc但不是.abc *Text* 当前目录下所有文件名中包含有Text的文件名,但不包括.开头的文件[ab-dm]* 当前目录下所有以a、b、c、d、m开头的文件名[ab-dm]? 当前目录下所有以a、b、c、d、m开头且后面只跟有一个字符的文件名[!ab-dm]?或[^ab-dm]?当前目录下所有不以a、b、c、d、m开头且后面只跟有一个字符的文件名/dev/hd? 目录/dev下所有以hd开头且只有三个字符的文件名(3)注释符与注释在shell命令或shell编程中从字符“#”开始以后到行末的部分作为注释,因此以“#”开头的行是注释行。
(4)转义字符(5)Linux系统的特殊键2.保留字任何编程语言或系统都有一定数量的保留字,bashell的部分保留字如下:!,[,],(,),{,},break,continue,cd,echo,eval,exec,exit,export,function,getopts,hash,pwd,read,readonly,return,select,set,shift,test,time,trap,type,ulimit,unset,umask,wait,for,do,done,case,in,esac,if,else,elif,if,while,until转义字符所代表的意义转义字符所代表的意义\a 响铃符\t Tab键\b 退格键\v 垂直制表符\f 换页\\ \\n 换行\0??? 8进制表示\x?? 16进制表示\’’\` ` \””特殊键意义Ctrl+D 结束当前程序输入或终止当前程序或从系统中注销Ctrl+C 终止当前程序的执行Ctrl+\ 终止当前程序的执行(系统内部处理时不同于Ctrl+C)Ctrl+Z 挂起当前程序执行,将推到后台Ctrl+S/Ctrl+Q 暂停/继续屏幕的输出,必须配合使用ScrollLock 暂停/继续屏幕的输出,开关键Ctrl+Alt+Del 默认动作为重启系统Alt+F# 字符终端切换。
Linux操作系统(第4版)shell编程
引用变量时,需在变量名前面加“$”符号。 • 使用变量时,需要在变量名前加“$”符号,
例如echo $season。当然使用时也会遇到一些 比较特殊的情况,就是变量名包含在其他字符 串中,这时就需要用“{}”将变量名括起来。
10.1.3 管道
• 管道和输入输出重定向十分类似。管道的 作用是在一个命令的标准输出和另一个命 令的标准输入之间建立一个通道。
10.1.4 shell里的特殊字符
• 和其他编程语言一样,shell里也有特殊字 符,常见的有美元符号“$”、反斜线“\” 和引号。美元符号表示变量替换,即用其 后指定的变量的值来代替变量。反斜线“\” 为转义字符,用于告诉shell不要对其后面 的那个字符进行特殊处理,只当作普通字 符。而shell下的引号情况比较复杂,分为3 种:双引号“"”、单引号“'”和倒引号 “`”。
• conditionN为分支条件,每个分支条件后必须以两个分号“;;” 结尾。如果都无法匹配,可用“*”代替,相当于default。 10.4.2小节中的if/elif/.../else结构多重分支语句示例也可改写 成如下形式。
• #!/bin/bash • case "$#" in • 0) echo "You didn't enter any parameter" • ;; • 1) echo "You entered only one parameter" • ;; • *) echo "You entered $# parameters" • ;; • esac • 当分支条件较多时,case语句将比if的多重分支显得简洁清晰。
Linux编程 shell命令行
Linux编程shell命令行理解shell命令行的基本功能有助于编写出更好的shell脚本。
使用shell命令行可以完成多种不同的工作,如下所示:●使用带模式匹配或者表达式的程序搜索文件或者目录。
这些命令包括GNUgawk(awk的链接)和grep命令族(包括egrep和fgrep)。
●从文件或者命令中获得数据,和向文件或者命令传送数据,分别称为输入重定向和输出重定向。
●将程序的输出过滤或者传送到另一个命令(称为使用管道)。
shell的内部作业控制命令可以将命令行作为后台进程启动,挂起一个运行程序,有选择地重新激活挂起程序或者杀死运行程序,以及完成其他进程控制功能。
多个命令可以在一个命令行中运行,如图2所示:图2 运行多个命令图3 扩充长shell命令行图2显示了w、free和df命令的输出。
长shell命令行可以在shell脚本内扩充或者使用反斜杠字符(\)在命令行上扩充。
如图3所示。
该例的前3行是一个单独的命令行,该命令行包含了两个echo命令。
当使用反斜线作为续行符时,它必须是命令行或者shell脚本的最后一个字符。
1.shell模式匹配支持shell命令行允许使用通配符作为特殊结构的字符串模式。
shell模式串既可以简单也可以复杂。
下面列出了用于shell模式匹配的一些常用字符:●*——用于匹配任意字符。
例如,要查找当前目录中所有以.doc结尾的文件,可以使用如下所示的命令:]# ls *.doc●?——用于匹配一个字符。
例如,要查找当前目录中所有以.d??结尾的文件(这里的?可以是0-9、),可以使用如下所示的命令:]# ls *.d??●[xxx]或者[x-x]——用于匹配字符范围。
例如,要列出一个目录中名字包含数字的所有文件,可以使用如下所示的命令:# ls *[0-9]*\x——匹配或者解除特殊字符(例如?)的特殊含义。
例如,要创建一个名字包含?的文件,可以使用如下所示的命令:# touch aFile\?另外,需要读者注意的是,shell可能按与Linux命令不同的方式解释某些字符或者正则表达式,除非特别小心,否则混淆shell脚本中的通配符和正则表达式将会出现问题。
Linux与Unixshell编程指南(完整高清版).pdf
Linux与Unixshell编程指南(完整⾼清版).pdf找到⼀本很详细的Linux Shell脚本教程,其实⾥⾯不光讲了Shell脚本编程,还介绍了系统的各种命令本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的⽂字处理以及少量的系统管理问题。
本书内容全⾯、⽂字简洁流畅,适合Shell编程⼈员学习、参考。
⽬录译者序前⾔第⼀部分 shell第1章⽂件安全与权限 11.1 ⽂件 11.2 ⽂件类型 21.3 权限 21.4 改变权限位 41.4.1 符号模式 41.4.2 chmod命令举例 51.4.3 绝对模式 51.4.4 chmod命令的其他例⼦ 61.4.5 可以选择使⽤符号模式或绝对模式 71.5 ⽬录 71.6 suid/guid 71.6.1 为什么要使⽤suid/guid 81.6.2 设置suid/guid的例⼦ 81.7 chown和chgrp 91.7.1 chown举例 91.7.2 chgrp举例 91.7.3 找出你所属于的⽤户组 91.7.4 找出其他⽤户所属于的组 101.8 umask 101.8.1 如何计算umask值 101.8.2 常⽤的umask值 111.9 符号链接 121.9.1 使⽤软链接来保存⽂件的多个映像 121.9.2 符号链接举例 121.10 ⼩结 13第2章使⽤find和xargs 142.1 find命令选项 142.1.1 使⽤name选项 152.1.2 使⽤perm选项 162.1.3 忽略某个⽬录 162.1.4 使⽤user和nouser选项 162.1.5 使⽤group和nogroup选项 162.1.6 按照更改时间查找⽂件 172.1.7 查找⽐某个⽂件新或旧的⽂件 172.1.8 使⽤type选项 172.1.9 使⽤size选项 182.1.10 使⽤depth选项 182.1.11 使⽤mount选项 182.1.12 使⽤cpio选项 182.1.13 使⽤exec或ok来执⾏shell命令 192.1.14 find命令的例⼦ 202.2 xargs 202.3 ⼩结 21第3章后台执⾏命令 223.1 cron和crontab 223.1.1 crontab的域 223.1.2 crontab条⽬举例 233.1.3 crontab命令选项 233.1.4 创建⼀个新的crontab⽂件 243.1.5 列出crontab⽂件 243.1.6 编辑crontab⽂件 243.1.7 删除crontab⽂件 253.1.8 恢复丢失的crontab⽂件 253.2 at命令 253.2.2 列出所提交的作业 273.2.3 清除⼀个作业 273.3 &命令 273.3.1 向后台提交命令 283.3.2 ⽤ps命令查看进程 283.3.3 杀死后台进程 283.4 nohup命令 293.4.1 使⽤nohup命令提交作业 293.4.2 ⼀次提交⼏个作业 293.5 ⼩结 30第4章⽂件名置换 314.1 使⽤* 314.2 使⽤? 324.3 使⽤[...]和[!...] 324.4 ⼩结 33第5章 shell输⼊与输出 345.1 echo 345.2 read 355.3 cat 375.4 管道 385.5 tee 395.6 标准输⼊、输出和错误 405.6.1 标准输⼊ 405.6.2 标准输出 405.6.3 标准错误 405.7 ⽂件重定向 405.7.1 重定向标准输出 415.7.2 重定向标准输⼊ 425.7.3 重定向标准错误 425.8 结合使⽤标准输出和标准错误 43 5.9 合并标准输出和标准错误 435.10 exec 445.11 使⽤⽂件描述符 445.12 ⼩结 45第6章命令执⾏顺序 466.1 使⽤&& 466.2 使⽤|| 466.3 ⽤()和{ }将命令结合在⼀起 47 6.4 ⼩结 48第⼆部分⽂本过滤第7章正则表达式介绍 497.1 使⽤句点匹配单字符 507.2 在⾏⾸以^匹配字符串或字符序列 50 7.3 在⾏尾以$匹配字符串或字符 517.4 使⽤*匹配字符串中的单字符或其重复序列 517.5 使⽤\屏蔽⼀个特殊字符的含义 52 7.6 使⽤[]匹配⼀个范围或集合 527.7 使⽤\{\}匹配模式结果出现的次数 53 7.8 ⼩结 55第8章 grep家族 568.1 grep 578.1.1 双引号引⽤ 578.1.2 grep选项 578.1.3 查询多个⽂件 578.1.4 ⾏匹配 578.1.5 ⾏数 588.1.6 显⽰⾮匹配⾏ 588.1.7 精确匹配 588.1.8 ⼤⼩写敏感 588.2 grep和正则表达式 588.2.1 模式范围 598.2.2 不匹配⾏⾸ 598.2.3 设置⼤⼩写 598.2.4 匹配任意字符 598.2.5 ⽇期查询 598.2.6 范围组合 608.2.8 使⽤grep匹配“与”或者“或”模式 61 8.2.9 空⾏ 618.2.10 匹配特殊字符 618.2.11 查询格式化⽂件名 618.2.12 查询IP地址 618.3 类名 628.4 系统grep命令 628.4.1 ⽬录 638.4.2 passwd⽂件 638.4.3 使⽤ps命令 638.4.4 对⼀个字符串使⽤grep 648.5 egrep 648.6 ⼩结 65第9章 AWK介绍 669.1 调⽤awk 669.2 awk脚本 679.2.1 模式和动作 679.2.2 域和记录 679.2.3 awk中正则表达式及其操作 709.2.4 元字符 709.2.5 条件操作符 709.2.6 awk内置变量 739.2.7 NF、NR和FILENAME 749.2.8 awk操作符 759.2.9 内置的字符串函数 789.2.10 字符串屏蔽序列 809.2.11 awk输出函数printf 819.2.12 printf修饰符 819.2.13 awk数组 869.3 ⼩结 88第10章 sed ⽤法介绍 8910.1 sed怎样读取数据 8910.2 调⽤sed 8910.2.1 保存sed输出 9010.2.2 使⽤sed在⽂件中查询⽂本的⽅式 90 10.2.3 基本sed编辑命令 9010.3 sed和正则表达式 9110.4 基本sed编程举例 9110.4.1 使⽤p(rint)显⽰⾏ 9110.4.2 打印范围 9110.4.3 打印模式 9210.4.4 使⽤模式和⾏号进⾏查询 9210.4.5 匹配元字符 9210.4.6 显⽰整个⽂件 9210.4.7 任意字符 9210.4.8 ⾸⾏ 9210.4.9 最后⼀⾏ 9310.4.10 打印⾏号 9310.4.11 附加⽂本 9310.4.12 创建sed脚本⽂件 9410.4.13 插⼊⽂本 9410.4.14 修改⽂本 9510.4.15 删除⽂本 9610.4.16 替换⽂本 9610.5 使⽤替换修改字符串 9710.6 将sed结果写⼊⽂件命令 9710.7 从⽂件中读⽂本 9810.8 匹配后退出 9810.9 显⽰⽂件中的控制字符 9910.10 使⽤系统sed 9910.10.1 处理控制字符 9910.10.2 处理报⽂输出 10110.10.3 去除⾏⾸数字 10110.10.4 附加⽂本 10210.10.5 从shell向sed传值 10210.10.6 从sed输出中设置shell变量 102 10.11 快速⼀⾏命令 102第11章合并与分割 10411.1 sort⽤法 10411.1.1 概述 10411.1.2 sort选项 10411.1.3 保存输出 10511.1.4 sort启动⽅式 10511.1.5 sort对域的参照⽅式 10511.1.6 ⽂件是否已分类 10511.1.7 基本sort 10611.1.8 sort分类求逆 10611.1.9 按指定域分类 10611.1.10 数值域分类 10611.1.11 唯⼀性分类 10711.1.12 使⽤k的其他sort⽅法 10811.1.13 使⽤k做分类键排序 10811.1.14 指定sort序列 10811.1.15 pos⽤法 10811.1.16 使⽤head和tail将输出分类 109 11.1.17 awk使⽤sort输出结果 10911.1.18 将两个分类⽂件合并 11011.2 系统sort 11011.3 uniq⽤法 11111.4 join⽤法 11211.5 cut⽤法 11411.5.1 使⽤域分隔符 11511.5.2 剪切指定域 11511.6 paste⽤法 11611.6.1 指定列 11611.6.2 使⽤不同的域分隔符 11611.6.3 paste命令管道输⼊ 11711.7 split⽤法 11711.8 ⼩结 118第12章 tr⽤法 11912.1 关于tr 11912.1.1 字符范围 11912.1.2 保存输出 12012.1.3 去除重复出现的字符 12012.1.4 删除空⾏ 12012.1.5 ⼤写到⼩写 12112.1.6 ⼩写到⼤写 12112.1.7 删除指定字符 12112.1.8 转换控制字符 12212.1.9 快速转换 12212.1.10 匹配多于⼀个字符 12312.2 ⼩结 123第三部分登录环境第13章登录环境 12513.1 /etc/profile 12513.2 ⽤户的$HOME.profile 12813.3 stty⽤法 12913.4 创建.logout⽂件 13113.5 ⼩结 131第14章环境和shell变量 13214.1 什么是shell变量 13214.2 本地变量 13214.2.1 显⽰变量 13314.2.2 清除变量 13314.2.3 显⽰所有本地shell变量 133 14.2.4 结合变量值 13414.2.5 测试变量是否已经设置 13414.2.6 使⽤变量来保存系统命令参数 135 14.2.7 设置只读变量 13514.3 环境变量 13614.3.1 设置环境变量 13614.3.2 显⽰环境变量 13614.3.3 清除环境变量 13714.3.4 嵌⼊shell变量 13714.3.6 set命令 14014.3.7 将变量导出到⼦进程 140 14.4 位置变量参数 14114.4.1 在脚本中使⽤位置参数 142 14.4.2 向系统命令传递参数 142 14.4.3 特定变量参数 14314.4.4 最后的退出状态 14414.5 ⼩结 145第15章引号 14615.1 引⽤必要性 14615.2 双引号 14615.3 单引号 14715.4 反引号 14715.5 反斜线 14815.6 ⼩结 149第四部分基础shell编程第16章 shell脚本介绍 15116.1 使⽤shell脚本的原因 15116.2 脚本内容 15116.3 运⾏⼀段脚本 15216.4 ⼩结 153第17章条件测试 15417.1 测试⽂件状态 15417.2 测试时使⽤逻辑操作符 155 17.3 字符串测试 15517.4 测试数值 15617.5 expr⽤法 15717.5.1 增量计数 15817.5.2 数值测试 15817.5.3 模式匹配 15817.6 ⼩结 159第18章控制流结构 16018.1 退出状态 16018.2 控制结构 16018.2.1 流控制 16118.2.2 循环 16118.3 if then else语句 16118.3.1 简单的if语句 16218.3.2 变量值测试 16218.3.3 grep输出检查 16318.3.4 ⽤变量测试grep输出 163 18.3.5 ⽂件拷贝输出检查 16418.3.6 当前⽬录测试 16418.3.7 ⽂件权限测试 16518.3.8 测试传递到脚本中的参数 165 18.3.9 决定脚本是否为交互模式 165 18.3.10 简单的if else语句 16618.3.11 变量设置测试 16618.3.12 检测运⾏脚本的⽤户 166 18.3.13 将脚本参数传⼊系统命令 167 18.3.14 null:命令⽤法 16718.3.15 测试⽬录创建结果 16818.3.16 另⼀个拷贝实例 16918.3.17 多个if语句 16918.3.18 测试和设置环境变量 169 18.3.19 检测最后命令状态 17018.3.20 增加和检测整数值 17118.3.21 简单的安全登录脚本 172 18.3.22 elif⽤法 17318.3.23 使⽤elif进⾏多条件检测 173 18.3.24 多⽂件位置检测 17418.4 case语句 17518.4.1 简单的case语句 17518.4.2 对匹配模式使⽤| 17618.4.3 提⽰键⼊y或n 17718.4.4 case与命令参数传递 177 18.4.5 捕获输⼊并执⾏空命令 17818.5 for循环 18018.5.1 简单的for循环 18118.5.2 打印字符串列表 18118.5.3 对for循环使⽤ls命令 18118.5.4 对for循环使⽤参数 18218.5.5 使⽤for循环连接服务器 18318.5.6 使⽤for循环备份⽂件 18318.5.7 多⽂件转换 18318.5.8 多sed删除操作 18418.5.9 循环计数 18418.5.10 for循环和本地⽂档 18418.5.11 for循环嵌⼊ 18518.6 until循环 18618.6.1 简单的until循环 18618.6.2 监视⽂件 18718.6.3 监视磁盘空间 18718.7 while循环 18818.7.1 简单的while循环 18818.7.2 使⽤while循环读键盘输⼊ 188 18.7.3 ⽤while循环从⽂件中读取数据 189 18.7.4 使⽤IFS读⽂件 18918.7.5 带有测试条件的⽂件处理 190 18.7.6 扫描⽂件⾏来进⾏数⽬统计 191 18.7.7 每次读⼀对记录 19318.7.8 忽略#字符 19318.7.9 处理格式化报表 19418.7.10 while循环和⽂件描述符 196 18.8 使⽤break和continue控制循环 197 18.8.1 break 19718.8.2 跳出case语句 19718.8.3 continue 19718.8.4 浏览⽂件⾏ 19818.9 菜单 19918.10 ⼩结 201第19章 shell函数 20219.1 在脚本中定义函数 20319.2 在脚本中使⽤函数 20319.3 向函数传递参数 20319.4 从调⽤函数中返回 20319.5 函数返回值测试 20419.6 在shell中使⽤函数 20419.7 创建函数⽂件 20419.8 定位⽂件 20519.9 检查载⼊函数 20519.10 执⾏shell函数 20519.10.1 删除shell函数 20619.10.2 编辑shell函数 20619.10.3 函数举例 20719.10.4 将函数集中在⼀起 21919.11 函数调⽤ 21919.11.1 在脚本中调⽤函数 21919.11.2 从函数⽂件中调⽤函数 220 19.12 定位⽂件不只⽤于函数 22219.13 ⼩结 223第20章向脚本传递参数 22420.1 shift命令 22520.1.1 shift命令简单⽤法 22520.1.2 命令⾏输⼊的最后⼀个参数 225 20.1.3 使⽤shift处理⽂件转换 22620.2 getopts 22920.2.1 getopts脚本实例 22920.2.2 getopts使⽤⽅式 23120.2.3 使⽤getopts指定变量取值 231 20.2.4 访问取值⽅式 23220.2.5 使⽤getopts处理⽂件转换 233 20.3 ⼩结 235第21章创建屏幕输出 23621.1.1 字符串输出 23621.1.2 数字输出 23721.1.3 布尔输出 23721.2 tput⽤法 23721.2.1 设置tput命令 23721.2.2 使⽤布尔输出 23721.2.3 在脚本中使⽤tput 23721.2.4 产⽣转义序列 23821.2.5 光标位置 23921.2.6 在屏幕中⼼位置显⽰⽂本 240 21.2.7 查找终端属性 24021.2.8 在脚本中使⽤功能键 24121.2.9 使⽤颜⾊ 24221.2.10 产⽣颜⾊ 24321.2.11 创建精致菜单 24621.3 ⼩结 251第22章创建屏幕输⼊ 25222.1 增加记录 25222.2 删除记录 26222.3 修改记录 26622.4 查看记录 27022.5 ⼩结 273第23章调试脚本 27423.1 ⼀般错误 27423.1.1 循环错误 27423.1.2 典型的漏写引号 27423.1.3 测试错误 27423.1.4 字符⼤⼩写 27523.1.5 for循环 27523.1.6 echo 27523.2 set命令 27523.3 ⼩结 276第24章 shell嵌⼊命令 27724.1 shell嵌⼊命令完整列表 277 24.1.1 pwd 27724.1.2 set 27824.1.3 times 27824.1.4 type 27824.1.5 ulimit 27924.1.6 wait 27924.2 ⼩结 279第五部分⾼级shell编程技巧第25章深⼊讨论<< 28125.1 快速创建⼀个⽂件 28125.2 快速创建打印⽂档 28125.3 ⾃动选择菜单 28225.4 ⾃动ftp传输 28325.5 访问数据库 28625.6 ⼩结 288第26章 shell ⼯具 28926.1 创建保存信息的⽂件 28926.1.1 使⽤date命令创建⽇志⽂件 289 26.1.2 创建唯⼀的临时⽂件 29026.2 信号 29126.2.1 杀死⼀个进程 29226.2.2 检测信号 29326.3 trap 29426.3.1 捕获信号并采取相应的⾏动 294 26.3.2 捕获信号并采取⾏动的另⼀个例⼦ 29526.3.3 锁住终端 29726.3.4 忽略信号 29826.4 eval 30026.4.1 执⾏含有字符串的命令 300 26.4.2 给每个值⼀个变量名 30126.5 logger命令 30226.5.1 使⽤logger命令 30326.6 ⼩结 305第27章⼏个脚本例⼦ 30627.1 pingall 30627.2 backup_gen 30627.3 del.lines 31227.4 access.deny 31327.5 logroll 31627.6 nfsdown 31727.7 ⼩结 317第28章运⾏级别脚本 31828.1 怎么知道系统中是否含有运⾏级别⽬录 31828.2 确定当前的运⾏级别 31928.3 快速熟悉inittab 31928.4 运⾏级别 32028.4.1 各种运⾏级别 32128.4.2 运⾏级别脚本的格式 321 28.4.3 安装运⾏级别脚本 32228.5 使⽤inittab来启动应⽤程序 323 28.6 启动和停⽌服务的其他⽅法 324 28.7 ⼩结 324第29章 cgi脚本 32529.1 什么是Web页⾯? 32529.2 cgi 32529.3 连接Web服务器 32629.4 cgi和HTM脚本 32629.4.1 基本cgi脚本 32629.4.2 显⽰shell命令输出 32829.4.3 使⽤SSI 33029.4.4 访问计数器 33029.4.5 使⽤⼀个链接来显⽰当前Web 环境变量 33229.4.6 其他常⽤的环境变量 334 29.5 get和post⽅法简介 33529.5.1 get⽅法 33529.5.2 post⽅法 34029.5.3 填充列表项 34729.5.4 ⾃动刷新页⾯ 34829.6 ⼩结 349附录常⽤shell命令 350。
Linux第四章作业答案
第四章 Linux编程作业参考答案一,AWK命令行应用1)处理/etc/passwd文件a)打印第一列(userid)提示:awk -F 分隔符‘{print $第几列}’fileb)打印root用户的1,2 field2)打印用户home目录下所有文件的:owner和文件名(只打印这两列)提示:使用ls -l 和 awk3)打印所有登录本机器的ip,并去掉重复。
提示:使用last,awk,sort,uniq二,AWK完整流程创建order文件 (商品名,数量,单价)apple 20 6.5orange 10 8grape 7 12berry 5 32输出格式 awk -f order.awk order (参考employee.awk)name count price (表头)apple 20 6.5...=================== (表尾)order.awkBEGIN{print "name\tcount\tprice"; OFS="\t"}{print $1,$2,$3}END{print "=========================\n"}三,AWK变量,计算使用order文件 (商品名,数量,单价)apple 20 6.5orange 10 8grape 7 12berry 5 32输出格式:awk -f order2.awk ordername count price total...Number of item: Total count: Order total price:order2.awkBEGIN{print "name\tcount\tprice\ttotal"; OFS="\t"; total=0; totalCount=0;} {totalCount += $2;total += ($2 * $3);print $1, $2, $3, $2*$3}END{printf "Number of item: %d, Total count: %d, Order total price: %.2f\n", NR, totalCount, total}四、AWK donation作业Mike:Harrington:(510) 548-1278:250:100:175Christian:Dobbins:(408) 538-2358:155:90:201Susan:Dalsass:(206) 654-6279:250:60:50Archie:McNichol:(206) 548-1348:250:100:175Jody:Savage:(206) 548-1278:15:188:150Guy:Quigley:(916) 343-6410:250: 100:175Dan:Savage:(406) 298-7744:450:300:275Nancy:McNeil:(206) 548-1278:250:80:75John:Goldenrod:(916) 348-4278:250:100:175Chet:Main:(510) 548-5258:50:95:135Tom:Savage:(408) 926-3456:250:168:200Elizabeth:Stachelin:(916) 440-1763:175:75:300donation2.awkBEGIN{FS=":"; total = 0; max = 0; i = 0;print " *** FIRST QUARTERLY REPORT *** ";print " *** CAMPAIGN 2000 CONTRIBUTIONS *** ";print "-------------------------------------------------------------------------------";printf("%20s %15s %8s %8s %8s %15s\n", "NAME","PHONE", "Jan", "Feb", "Mar", "Total Donated");print "-------------------------------------------------------------------------------";}{name=$1 " " $2;subtotal=$4+$5+$6;total = total + subtotal;if (subtotal > 500) { names[i] = name; phone[i] = $3; lastToIndex[$2 $3]=i; i++}if (subtotal > max) { max = subtotal; max_name=name; max_first=$1;}printf("%20s %15s %8.2f %8.2f %8.2f %15.2f\n", name, $3, $4, $5, $6, subtotal);}END{print "-------------------------------------------------------------------------------";print " SUMMARY"print "-------------------------------------------------------------------------------";printf ("The campaign received a total of $%.2f for this quartar.\n", total); printf ("The average donation for the %d contributors was $%0.2f.\n", NR, total/NR);printf ("The highest total contribution was $%0.2f made by %s.\n", max, max_name);printf (" *** THANKS %s***\n", max_first);printf ("The following people donated over $500 to the campaign.\n");printf ("They are eligible for the quarterly drawing!!\n");printf ("Listed are their names (sorted by last name) and phone numbers:\n");len=asorti(lastToIndex, sortname);for (i = 1; i <= len; i++) {ii = lastToIndex[sortname[i]];printf (" %s--%s\n", names[ii], phone[ii]);}printf (" Thanks to all of your continued support!!\n");}运行结果:五、Shell 变量写一个脚本weather.sh,完成下面功能:外部定义环境变量:export weather=”Sunny”输入What’s your name? (echo, read)Which city do you live? (echo, read)输出:Hi “名字”,the weather of “城市” is“定义的weather”执行脚本:chmod u+x weather.sh; ./weather.sh外部定义局部变量weather1, 使用source执行?#!/bin/bashread -p "What's your name?" nameread -p "Which city do you live?" cityecho "hi $name, the weather of $city is $weather. Local weather is $weather1."六、Shell String pattern match创建一个脚本:ip_match.sh用户输入一个string,判断是否是IPv4地址yes: 输出This is an IPv4 addressno: 输出Wrong address提示: IPv4 regex: ([0-9]{1,3}\.){3}[0-9]{1,3}#!/bin/bashpattern='([0-9]{1,3}\.){3}[0-9]{1,3}'echo "Input a string"read strif [[ $str =~ $pattern ]]; thenecho "This is a ipv4 address: $str"elseecho "Wrong address! $str"fi七、Shell 文件条件判断输入:please input a file name:逻辑:如果文件已经存在:the file already exites不存在,新建一个空文件,名字为输入的string。
linux操作系统shell编程
实验五Linux的shell编程一、实验目的1.了解常用shell的编程特点,掌握shell程序设计的基础知识。
2.认识和理解shell程序流程控制、shell程序的运行方式、shell程序的调试方法。
3.基本掌握编写shell程序的步骤、方法和技巧。
二、实验环境Linux软件和计算机三、实验内容或步骤实验准备知识为书上5.3,5.4,5.5以及第23章内容,p73~84,p374-394。
1、shell脚本的建立同建立普通文本文件的方式相同,可利用编辑器vi或cat命令,进行程序录入和编辑加工。
由三条简单命令组成的Shell程序,文件名为prog。
ls –lcalwho2、shell脚本的执行(通常用三种方式)1)、输入定向的执行方式sh < 脚本名如:sh < prog2)、以脚本名作为Shell参数的执行方式sh 脚本名[参数] 如:sh prog3)、改执行权限后直接执行方式如:# chmod a+x prog# ./prog3、Shell变量:1)、可写的环境变量$ echo $PS1$ PS1=“[\u@@@wdg-Linux-9]”2)、位置参数:在命令行传递给shell脚本的参数。
(1)位置参数及引用可以编写一个shell脚本,当从命令行或者从其他shell脚本中调用它的时候,这个脚本接收若干参数。
这些选项是通过Linux作为位置参数(positional parameter)提供给shell程序的。
在shell脚本中应有变量,接收实参,这类变量的名称很特别,分别是1,2,3,…,这类变量称为位置变量。
位置参数1存放在位置变量1中,位置参数2存放位置变量2中,……,在程序中可以使用$1,$2,……来访问。
下述是一个shell程序的mypgm1,只带了一个参数(名字),并在屏幕上显示这个名字:#Name display program1if [ $# -eq 0 ]thenecho“Name not provided”elseecho”Your name is $1”fi在pdksh和bash中,如果执行mypgm1如下:#.mypgm1将得到输出:Name not provided但是,如果执行mypgm1如下:#.mypgm1sanjia则得到如下的输出:Your name is sanjia(2)用set命令为位置参数赋值在shell程序中可以利用set命令为位置参数赋值或重新赋值。
Linux_基础教程--Shell脚本编程
学习各种管理和监视命令的使用
学习各种文本文件工具的使用
2014年12月24日
变量和表达式
2014年12月24日
18
Shell 变量操作
变量替换扩展
输入
变量测试 变量的字符串操作 变量的间接引用 $[expression] $((expression)) expr let declare -i
Shell 脚本的执行
PATH 环境变量的默认值不包含当前目录, 若脚本文件在当前目录,应使用 ./script-file
PATH 环境变量的默认值包含 ~/bin 目录, 用户可以将自己的脚本文件存放在 ~/bin 目录, 之后即可直接调用脚本文件名执行脚本了
2014年12月24日
7
Shell 脚本的编码规范
${var/%old/new}
用new替换${var}中结尾部分与old匹配的部分
注: (1)old 中可以使用 通配符。 (2)var 可以是 @ 或 *,表示对每个位置参数进行替换
sh –n 脚本名
对脚本进行语法检查,但不执行脚本。如果存在语法错误,shell 会报错,如果没有错误,则不显示任何内容。
2014年12月24日
12
脚本调试举例 1
对脚本进行语法检查
$ bash -n greetings.sh
显示脚本中每个原始命令行及其执行结果
$ bash -v greetings.sh
2014年12月24日 22
字符串变量替换扩展举例1
str='I love linux. I love UNIX too.‟
Shell 编程 教程
2. 逻辑与
Hale Waihona Puke 逻辑与操作符“&&‖可把两个命令联系在一起,
其一般形式是: 命令1&&命令2 其功能是,先执行命令1,如果执行成功,才 执行命令2;否则,若命令1执行不成功,则 不执行命令2。 例如: [wuxy@localhost pro]$cp example1 example11 && rm example1
例:
[wuxy@localhost pro]$ ps –a >> outfile 则把ps命令的输出附加到文件outfile的结尾处。 4. 即时文件定向符 即时文件是由重新定向符“<<‖、一对标记符以及其
中的若干输入符组成。它允许把shell程序的输入行 重新定向到一个命令中。即时文件的形式是: 命令 [参数] <<标记符 输入行 …… 标记符 注意:使用较少
2. 执行shell脚本
执行shell脚本的方式基本上有下述三种:
(1)输入定向到shell脚本。 其一般形式是: $bash<脚本名 例如:$bash <example1 (2)以脚本名作为参数。其一般形式为: $bash 脚本名 [参数] 例如,$bash example1
4.2 创建和执行shell脚本
1. 建立shell脚本
shell脚本(shell script)是指使用用户环境
shell提供的语句所编写的命令文件。shell脚 本可以包含任意从键盘输入的Linux命令。 建立shell脚本的步骤与建立普通文本文件的 方式相同,利用文字编辑器(如vi)进行程 序录入和编辑加工。例如建立一个名为ex1的 shell脚本,可提示符后输入命令: $vi example1
Linux下Shell编程
2013-2-4
西安理工大学计算机科学与工程学院
综述篇——Linux黑洞
/dev/null
是一个虚设的设备,俗称 “Linux黑洞”,任何对 /dev/null的写入都会成功,但 数据会消失得无影无踪,没有 任何反馈。所以经常把不想在 屏幕显示的信息全部送到 /dev/null中,在shell脚本中用 得比较多。 如:ls –l > /dev/null
还可以用来清空文件的内容: cat /dev/null > FileName
2013-2-4
西安理工大学计算机科学与工程学院
命令篇
用户管理 目录管理 文件管理 权限管理
2013-2-4
西安理工大学计算机科学与工程学院
命令篇——用户管理
新建用户(user add) useradd UserName 新建用户后,会在/home目录下建立一个以UserName命名的文件夹, 用户每次登录时自动定位到该文件夹下。 为用户添加密码(password) passwd UserName 删除用户(user delete) userdel UserName 使用–p选项可以删除用户目录下的文件及与用户相关联的其他 文件。 新建组群(group add) groupadd GroupName 删除组群(group delete) groupdel GroupName
2013-2-4
西安理工大学计算机科学与工程学院
命令篇——文件管理
新建文件 >FileName 或 touch FileName 或 vi FileName 删除文件(remove file) rm [选项] FileName 选项:-i 系统提示是否真要删除该文件 -f 删除文件之前不提示任何确认信息 -r 递归删除目录下所有子目录的内容 文件拷贝(copy) cp SourceFile TargetFile 文件链接(link) ln –s SourceFile TargetFile 创建文件链接,用ls –l查看,会看到TargetFile->SourceFile
