第五章 shell 编程 shell 编程的基本过程分为三步: 1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本

Slides:



Advertisements
Similar presentations
Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
Advertisements

1 第 3 章 C++ 中的条件与循环 第 3 次见面! acm.nefu.edu.cn/C++_03.ppt.
CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
第 4 章 PHP 基本語法.
上課教材 Database Slide Windows筆電 (32 bit)
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
迴圈 迴圈基本觀念 while迴圈 do 迴圈 for迴圈 巢狀迴圈 迴圈設計注意事項 其他控制指令 迴圈與選擇的組合.
第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口.
TQC+ 物件導向程式認證-JAVA.
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
Chapter 4 流程控制.
UNIX系統與資料庫安裝 Why UNIX 常用的工具程式介紹 資料庫的安裝.
程式設計實作.
NUIST HPC使用讲座 ——代码调试 刘建宇
Chapter 1 複習.
第三讲 shell 程序设计.
第 2 章 上機使用 Unix/Linux 內容: 操作介面 主機連線 登入主機 認識系統環境 使用者常用命令.
台灣大學計算機及資訊網路中心 教學研究組 張傑生
C++Primer 3rd edition 中文版 Chap 5
Shell Script 程式設計.
Shell程序设计 曙光信息产业股份有限公司.
Linux 基础与常用命令简介 生物信息学培训班 杭州,2018年1月18日 周银聪.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
第二天 计算机基础技能培训 (一)linux基础知识
Introduction to the C Programming Language
第4章 程序控制结构与算法基础.
新觀念的 VB6 教本 第七章 讓程式轉彎的控制敘述.
條件判斷指令 -if 指令 -switch 指令 迴圈指令 - for 迴圈 - while迴圈 - break、continue 指令
PHP 程式流程控制結構.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
程式語言Visual Basic 重複結構 黃瀧輝 老師 Long Hwai,Huang.
Introduction to the C Programming Language
電腦解題─流程圖簡介 臺北市立大同高中 蔡志敏老師.
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
第12章 shell编程基础 本章主要介绍shell编程的基础知识。shell脚本的执行类似于Linux下的任何其他命令,脚本可以包含复杂的逻辑,也可以包含一系列Linux命令行指令。在一个shell程序内可以运行其他shell脚本。通过本章的学习,读者可以学到如何使用bash(最流行的Linux.
編譯程式設計 期末專題說明 V1.1 May 2004.
第六章 shell 程序调试 一. 程序执行状态跟踪 程序: -n 读取命令, 但不执行. 主要用于跟踪程序流程是
如何有效率的學習Linux 培養組合能力 多用程式, 少寫程式 從錯誤訊息中學習 養成略讀 “各種文件” 加強英文基本閱讀能力 勤作筆記
小结 郭清溥.
Ch04 VB.NET的流程控制 網頁程式設計.
软件工程 第四章 软件设计 软件过程设计技术与工具.
程式結構&語法.
第六章 迴圈與陣列.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
UNIX指令-檔案與目錄操作.
for 迴圈 while迴圈 do-while迴圈 break 與 continue goto 與 標籤 程式觀摩
第七章 程序设计基础.
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
杨振伟 清华大学 第一讲:Linux环境下编程(1)
Instructor:Po-Yu Kuo 教師:郭柏佑
第3章 JavaScript基本语句.
本节内容 Lua基本语法.
1.3操作系统提供的服务和用户接口 操作系统提供的用户接口 程序接口与系统调用 操作接口与系统程序
台灣大學計算機及資訊網路中心 教學研究組 張傑生
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
國立清華大學 National Tsing Hua University
PHP程式設計 五、程式流程控制結構 建國科技大學 資訊管理學系 饒瑞佶.
程序管理 蘇偉順助教.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
Arguments to the main Function and Final Project
Visual FoxPro 应用基础与面向对象 程序设计教程
杨振伟 清华大学 第一讲:Linux环境下编程(1)
顺序查找与二分查找复习.
判斷(選擇性敘述) if if else else if 條件運算子.
Shell编程基础.
C语言基本语句 判断循环.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第六章 文件系统与文件管理 6.4 Linux文件管理 1、比较MS DOS 与 Linux的目录结构 一、Linux文件系统的树形结构
Presentation transcript:

第五章 shell 编程 shell 编程的基本过程分为三步: 1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本 文件; 2. 赋予shell文件执行权限 用chmod命令修改权限; 3. 执行shell文件 直接在命令行上调用shell程序.

实例: 1. 建立shell文件 (可用任何建立文本文件的方法): $ cat prog1 who | grep $1 2. 赋予执行权限: (初始文本文件无执行权限) $ chmod 740 prog1 3. 执行该shell程序 $ prog1 student5 prog1: not found (shell在标准搜索目录中找不到prog1命令) 4. 指定路径或修改环境变量PATH后执行shell程序 $ ./prog1 student5 student5 tty06 Feb 8 09:12

shell 程序和语句 shell 程序由零至多条shell语句构成. shell语 句包括三大类: 功能性语句、结构性语句和说明性 语句. 说明性语句: 以#号开始到行尾的部分,不被解释执行 功能性语句: 任意的操作系统命令、shell内部命令、自编 程序、其它shell程序名等。 结构性语句: 条件测试语句、多路分支语句、循环语句、 循环控制语句等。

告诉OS用哪种类型的shell来解释执行该程序 说明性语句(注释行): 注释行可以出现在程序中的任何位置,既可以 单独占用一行, 也可以接在执行语句的后面. 以#号 开始到所在行的行尾部分,都不被解释执行. 例如: #! /bin/sh # # 本程序说明 command_1 command_2 # command_2的语句说明 …… # 下面程序段的说明 command_m command_n # commandn_语句的说明 告诉OS用哪种类型的shell来解释执行该程序

几个常用的功能性语句(命令): read命令 read从标准输入读入一行, 并赋值给后面的变量, 其语法为: . read var . read var1 var2 var3 把读入行中的第一个词(word)赋给var1, 第 二个词赋给var2, ……把其余所有的词赋给最后一 个变量. 如果执行read语句时标准输入无数据, 则程序 在此停留等侯, 直到数据的到来或被中止运行.

应用实例 # example1 for read echo "Input your name: \c" read username echo "Your name is $username" #example2 for read echo "Input date with format yyyy mm dd: \c" read year month day echo "Today is $year/$month/$day, right?" echo "Press any key to confirm and continue\c" read answer echo "I know the date, bye!"

expr 命令 算术运算命令expr主要用于进行简单的整数运算,包 括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操 作。例如: 27 $ expr 3 - 8 / 2 -1 $ expr 25 % 4 1 $ num=9 $ sum=`expr $num \* 6 ` $ echo $sum 54 反斜线去掉*号的元字符含义 反撇号引用命令的运行结果

tput 命令 选项 功 能 tput命令主要用于设置终端工作模式, 或读出终端控制 字符. tput命令与终端控制代码数据库terminfo相连, 根据 shell环境变量TERM的值, 读出这种终端的指定功能控制代 码. 常用的终端功能控制如下表: 选项 功 能 bel 终端响铃 el 光标位置到行末清字符 blink 闪烁显示 smso 启动突出显示模式 bold 粗体字显示 smul 启动下划线模式 clear 清屏 rmso 结束突出显示模式 cup r c 光标移到 r 行 c 列 rmul 结束下划线模式 dim 显示变暗 rev 反白显示 ed 光标位置到屏幕底清屏 sgr0 关闭所有属性

应用实例一: # # program1 for tput tput clear tput cup 11 30 tput rev echo "Hello, everybody!" tput sgr0 tput cup 24 1 该程序先清屏, 并在屏幕中央位置(11行23列)用反极性 显示字符串"Hello, everybody!", 恢复正常显示极性后光标 停留在屏幕左下角.

在$bell和$s_uline之间的空格将同样在屏幕上显示, 使Computer Department的实际位置向右移动一格 应用实例二: # # program2 for tput bell=`tput bel` s_uline=`tput smul` e_uline=`tput rmul` tput clear tput cup 10 20 echo $bell $s_uline echo "Computer Department" echo $e_uline 功能: 响一声铃后, 在清空的屏幕中央以下划线模式显示字 符串"Computer Department" 注意 在$bell和$s_uline之间的空格将同样在屏幕上显示, 使Computer Department的实际位置向右移动一格

结构性语句: 结构性语句主要根据程序的运行状态、 输入数据、变量的取值、控制信号以及运行 时间等因素来控制程序的运行流程。主要包 括:条件测试语句(两路分支)、多路分支 语句、循环语句、循环控制语句和后台执行 语句等。 无任何结构性语句的shell程序是一种特 例。

一. 条件语句 if…then…fi 语法结构: if 表达式 then 命令表 fi 如果表达式为真, 则执行命令表中的命令; 否则退 出if语句, 即执行fi后面的语句. if和fi是条件语句的语句括号, 必须成对使用; 命令表中的命令可以是一条, 也可以是若干条.

shell程序prog2, 测试命令行参数是否为已存在 的文件或目录. 用法为: prog2 file 内容如下: 例子: shell程序prog2, 测试命令行参数是否为已存在 的文件或目录. 用法为: prog2 file 内容如下: #The statement of if…then…fi (注释语句) if [ -f $1 ] (测试参数是否为文件) then echo "File $1 exists" (引用变量值) fi if [ -d $HOME/$1 ] (测试参数是否为目录) echo "File $1 is a directory" (引用变量值)

执行prog2程序: $ prog2 prog1 File prog1 exists $ prog2 backup File backup is directory $0为prog2; $1为backup,是一个已存在的目录. 如果不带参数, 或大于一个参数运行prog2, 例如: $ prog2 (或 $ prog2 file1 file2) 将会出现什么结果?

二. 条件语句 if…then…else…fi 语法结构为: if 表达式 then 命令表1 else 命令表2 fi 如果表达式为真, 则执行命令表1中的命令, 退出if 语句; 否则执行命令表2中的语句, 退出if语句. 注意: 无论表达式是否为真, 都有语句要执行.

(如果没有exit语句,程序的执行结果是什么?) 例子: shell程序prog3, 用法为: prog3 file 内容如下: #The statement of if…then…else…fi if [ -d $1 ] then echo "$1 is a directory" exit (退出当前的shell程序) else if [ -f $1 ] echo "$1 is a common file" echo "unknown" fi (如果没有exit语句,程序的执行结果是什么?)

运行prog3程序: $ prog3 backup backup is a directory $ prog3 prog1 prog1 is a common file $ prog3 abc unknown prog3是对prog2的优化, 逻辑结构更加清晰合理! prog2的主要缺点是什么?

三. 测试语句 test test语句可测试三种对象: 字符串 整数 文件属性 每种测试对象都有若干测试操作符, 参见表8.14 例如: 字符串 整数 文件属性 每种测试对象都有若干测试操作符, 参见表8.14 例如: test "$answer" = "yes" 变量answer的值是否为字符串yes test $num –eq 18 变量num的值是否为整数18 test -d tmp 测试tmp是否为一个目录名

test命令的应用: test命令测试的条件成立时, 命令返回值为真(0) 否则返回值为假(非0). 用法一. liudi: test命令的应用: test命令测试的条件成立时, 命令返回值为真(0) 否则返回值为假(非0). 用法一. test $name -eq $1 echo $? 用法二. if test -f $filename then …… fi 通常简写为: if [ -f $filename ] 用方括号替代test语句 至少一个空格 至少一个空格

命令表以单独的双分号行结束,退出case语句 四. 多路分支语句 case…esac 多路分支语句case用于多重条件测试, 语法结构 清晰自然. 其语法结构为: case 字符串变量 in 模式1) 命令表1 ;; 模式2) 命令表2 …… 模式n) 命令表n esac case语句只能检测字符串变量 各模式中可用文件名元字符,以右括号结束 命令表以单独的双分号行结束,退出case语句 模式 n常写为字符* 表示所有其它模式 最后一个双分号行可以省略

实例. 程序prog4检查用户输入的文件名, 用法为: prog4 string_name # The statement of case…esac if [ $# -eq 0 ] then echo "No argument is declared" exit fi case $1 in file1) echo "User selects file1" ;; file2) echo "User selects file2" *) echo "You must select either file1 or file2!" esac

五. 循环语句 for…do…done 当循环次数已知或确定时, 使用for循环语句来多次执行 为: for 变量名 in 单词表 do 命令表 done 变量依次取单词表中的各个单词, 每取一次单词, 就执行一 次循环体中的命令. 循环次数由单词表中的单词数确定. 命 令表中的命令可以是一条, 也可以是由分号或换行符分开的 多条. 如果单词表是命令行上的所有位置参数时, 可以在for 语句中省略 "in 单词表" 部分.

flist的值是ls的执行结果即当前目录下的文件名 实例. 包含for语句的程序prog5拷贝当前目录下的所有文 件到backup子目录下. 使用语法及程序为: prog5 [filename] # The statement of for…do…done If [ ! -d $HOME/backup ] then mkdir $HOME/backup fi flist=`ls` for file in $flist do if [ $# = 1 ] if [ $1 = $file ] echo "$file found" ; exit else cp $file $HOME/backup echo "$file copied" done echo '***Back up completed***' flist的值是ls的执行结果即当前目录下的文件名 命令行上有一个参数时 命令行上不带参数时

六. 循环语句 while…do…done 语法结构为: while 命令或表达式 do 命令表 done 就执行一次循环体中的命令,然后再测试该命令或表达式 的值,执行循环体,直到该命令或表达式为假时退出循环。 while语句的退出状态为命令表中被执行的最后一条命 令的退出状态。

建立以file开头, 变量i的值结尾的空文件名. 参见命令 实例. 创建文件程序prog6, 用法为: prog6 file [number] # The statement for while if [ $# = 2 ] then loop=$2 else loop=5 fi i=1 while [ $i -eq $loop ] do >$1$i i=`expr $i + 1` done 根据命令行参数的个数确定循环的次数 建立以file开头, 变量i的值结尾的空文件名. 参见命令 cmd > file

七. 循环语句 until…do…done 语法结构为: until 命令或表达式 do 命令表 done until循环与while循环的功能相似, 所不同的是只有 当测试的命令或表达式的值是假时, 才执行循环体 中的命令表, 否则退出循环. 这一点与while命令正 好相反.

八. 循环控制语句 break 和 continue 一层, break n 则跳出n层; continue语句则马上转 到最近一层循环语句的下一轮循环上, continue n 则转到最近n层循环语句的下一轮循环上. 实例. 程序prog7的用法为: prog7 整数 整数 整数 … 参数个数不确定, 范围为1~10个, 每个参数都是正整 数.

if [ $# = 0 ] then echo "Numeric arguments required" exit fi if [ $# -gt 10 ] echo "Only ten arguments allowed" for number do count=`expr $number % 2` if [ $count -eq 1 ] continue else output="$output $number" done echo "Even numbers: $output " 取所有位置参数 用2求模, count的值只能是0或1 下 轮 循 环 是奇数 偶数放到偶数队列中

实例. 包含while、until和break语句的prog8 程序. while true do echo level1 until false echo level2 echo level3 break done while语句后的表达式为true(真), until语句后的表达式为 false(假), 循环条件永远成立, 因此是无限循环. 死循环程序, 只能由人工中断 改为continue 3 开始最外层循环 如果改为break 3 跳出最外层循环

在shell程序中, 常常把完成固定功能、且多次使 用的一组命令(语句)封装在一个函数里,每当要 使用该功能时只需调用该函数名即可。 函数在调用前必须先定义,即在顺序上函数说 明必须放在调用程序的前面。 调用程序可传递参数给函数, 函数可用return语 句把运行结果返回给调用程序. 函数只在当前shell中起作用, 不能输出到子shell 中.

函数的所有标准输出都传递给了主程序的变量 函数的返回值隐含在变量中, 由主程序使用该变量的值 函数格式: function_name ( ) { command1 …… commandn } 函数调用格式: value_name=`function_name [arg1 arg2 … ]` 或者: function_name [arg1 arg2 … ] echo $value_name 函数的所有标准输出都传递给了主程序的变量 函数的返回值隐含在变量中, 由主程序使用该变量的值

实例: check_user( ) #查找已登录的指定用户 { user=`ps –e | grep $1` if [ -n $user ] then return 1 #找到指定用户 else return 0 #未找到指定用户 fi } while true # MAIN, Main, main: program begin here do echo "Input username: \c" read uname check_user uname # 调用函数, 并传递参数uname if [ $? –eq 1 ] # $?为函数返回值 then echo "user $uname online" else echo "user $uname offline" done