第 4 章 Linux shell 程序设计 shell UNIX/Linux Linux shell shell if case while for shell Linux Linux 本章主要介绍 Linux shell( 默认是 bash) 的语法结构 变量定义及赋值引用 标点符号 控制语句等 本章的主要内容如下 : shell 的主要特点 类型 建立和执行方式 bash 变量的分类 定义形式及引用规则 各种控制语句的格式 功能及流程 bash 中算术运算的使用 bash 函数的构成及使用规则 bash 中的内置命令 4.1 shell 概述 shell UNIX UNIX shell Linux UNIX shell bash 4.1.1 shell 的特点和主要版本 1.shell 的特点 UNIX shell shell shell *? [ ] shell shell cd echo exit pwd kill shell / I/O &
86 Linux 教程 ( 第 4 版 ) shell shell shell UNIX shell shell 2.shell 的种类 Linux shell Bourne shell sh C shell csh Korn shell ksh Bourne Again shell bash 1 Bourne shell AT&T Bell Steven Bourne AT&T UNIX UNIX shell shell Bourne shell shell 2 C shell Bill Joy BSD UNIX sh C Bourne shell C shell Bourne shell 3 Korn shell AT&T Bell David Korn C shell Bourne shell Bourne shell Korn shell 4 Bourne Again shell bash GNU shell Linux shell bash Bourne shell C shell Korn shell 1 2 vi 3 4 Linux shell ash zsh shell bash 4.1.2 简单 shell 程序示例 shell $ ls -l / usr / meng shell shell shell Script shell 例 4.1 shell ex1 $ cat ex1 date pwd cd.. shell
第 4 章 Linux shell 程序设计 87 例 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 for i do ls -l $i grep '^d' done fi #!/bin/bash bash bash # shell if else for 0 4.1.3 shell 脚本的建立和执行 1.shell 脚本的建立 shell vi 2. 执行 shell 脚本的方式 shell shell shell $ bash < $ bash <ex1 shell ex1 shell shell bash $ bash $ bash ex2 /usr/meng /usr/zhang
88 Linux 教程 ( 第 4 版 ) shell shell. shell $. shell shell shell shell chmod $ chmod a+x ex2 shell ex2 PATH $ PATH=$PATH:.. ex2 $ ex2 shell shell shell shell shell shell /bin/usr/bin shell shell shell shell shell Mount shell shell 4.2 命令历史 bash /.bash_history History Substitution
第 4 章 Linux shell 程序设计 89 4.2.1 显示历史命令 history history [option] [arg ] history history $ history 81 alias 82 pwd 83 history 1 history history 50 50 history history al al history Enter -a -n -r -w -c 4.2.2 执行历史命令 \ = (
90 Linux 教程 ( 第 4 版 ) 4.1 表 4.1 基本事件指定字格式及其意义!!!-1!n n!-n n!-1!!!string string!ca cat!?string? string!?hist? hist!# $ date 2016 04 02 09:28:06 CST $ pwd /home/mengqc $ ls Desktop ex-1 ex-2 ex-3 ex90 exam15 exam19 m1 m2 myfile usr $ cat m1 echo Hello! $ history 1 date 2 pwd 3 ls 4 cat m1 5 history $!2 pwd 2 /home/mengqc $!c cat m1 echo Hello! $!?w? pwd /home/mengqc 4.2.3 配置历史命令环境 bash.bash_history HISTFILE $ HISTFILE="/home/mengqc/.myhistory" /home/mengqc/.myhistory
第 4 章 Linux shell 程序设计 91 500 HISTSIZE $ HISTSIZE=600 bash 600 HISTSIZE 4.3 名称补全 bash Linux Tab Linux Tab Enter Linux shell Esc shell Esc+? Tab 4.4 别名 4.4.1 定义别名 shell alias alias [name[=value]] name=value name value $ alias
92 Linux 教程 ( 第 4 版 ) alias..='cd..' alias cp='cp -i' = $ alias ll=' ls -l ' $ my=/home/mengqc my $ ll $my $my ll ls -l ll shell ll ll $my ls -l /home/mengqc shell $ alias ll=ls -l bash: alias: '-l' not found $ pwd /home/mengqc $ ll m1 -ln m2 ttt ll ls -l ls 4.4.2 取消别名 unalias name name $ unalias ll $ alias ll ll alias not found alias unalias unalias unalias a
第 4 章 Linux shell 程序设计 93 4.5 shell 特殊字符 shell * 4.5.1 通配符 1. 一般通配符 4 * 0 f* f fa f1 fa2 ffa.s f. / *file.profile.*file.profile /etc*.c /etc.c/etc/*.c? f? f1 fa fb f fabc f12 [] f [abcd] fa, fb, fc fd f1 fa1 fab - f [a-d] f [abcd] f [1-9] f [123456789] * -a [ *? ] abc -a*abc-a? abc! [] f [!1-9].c f 1 9.c fa.c fb.c fm.c * /usr/meng/f?/* / usr/meng f chapter[0-9]* chapter 0 9 chapter chapter0 chapter1 chapter28 chapter123 2. 模式表达式 bash Bourne shell *? [ ] *() 0 file*(.c.o) file file.c file.o file.c.c file.o.o file.c.o file.o.c file.h file.s
94 Linux 教程 ( 第 4 版 ) +() file+(.c.o) file.c file.o file.c.o file.c.c file?() 0 1 file?(.c.o) file file.c file.o file. c. c file. c. o @() file@(.c.o) file.c file.o file file.c.c file.c.o!() file*(.[cho].sh) * + 4.5.2 引号 shell 1. 双引号 $ `\ $ $ 4.4.1 /home/mengqc $my ` \$` "\ \ shell 例 4.3 $ cat ex3 echo "current directory is ` pwd ` " echo "home directory is $HOME" echo "file*.?" echo "directory '$HOME ' " $ ex3 current directory is /home/mengqc/prog home directory is /home/mengqc file*.? directory '/home/mengqc' ex3 echo `pwd` pwd `pwd` echo $HOME HOME $HOME echo echo '$HOME'
第 4 章 Linux shell 程序设计 95 $HOME HOME 2. 单引号 $ str=' echo "directory is $HOME" ' $ echo $str echo "directory is $HOME" echo "directory is $HOME " str echo $HOME $ echo 'The time is ` date `, the file is $HOME/abc ' The time is ` date `, the file is $HOME/abc echo 3. 倒引号 shell shell $ echo current directory is ` pwd ` current directory is /home/mengqc shell `pwd` pwd/home/mengqc `pwd` $ today=`date` $ echo Today is $today Today is 2016 04 02 09:38:39 CST $ users=` who wc -l ` $ echo The number of users is $users The number of users is 5 \ $ Nuser=`echo The number of users is \` who wc -l \` ` $ echo $Nuser The number of users is 5 $ Nuser1=`echo The number of users is `who wc -l` ` 0
96 Linux 教程 ( 第 4 版 ) $ echo $Nuser1 \ echo "Filename is \"$HOME\"\$* " Filename is "/home/mengqc"$* \\ \ 4.5.3 输入 / 输出重定向符 shell stdin stdout stderr shell 1. 输入重定向符 < score C scanf() file1 score file1 score $ score < file1 shell shell cmds $ cat cmds echo your working directory is ` pwd ` echo your name is ` logname ` echo The time is ` date ` who $ bash < cmds shell cmds shell <
第 4 章 Linux shell 程序设计 97 2. 输出重定向符 > $ who > abc who abc who abc who $ cat abc shell shell exp1 echo "The time is `date` " echo "Your name is `logname` " echo "Working directory is `pwd` " echo "It has `ls -l wc -l` files. " $ exp1 > tmp1 $ cat tmp1 The time is 2016 04 02 09:56:22 CST Your name is mengqc Working directory is /home/mengqc It has 26 files. exp1 > I/O cat f1.c > /dev/lp0 f1.c 3. 输出附加定向符 >> $ ps -l >> psfile ps psfile cat psfile >>
98 Linux 教程 ( 第 4 版 ) 4. 即时文件定向符 here document << shell << mail $1 <<! Best wishes to you on your birthday.!!! <<!!!! % mail!!$1 $ wc -l < infile > outfile wc infile outfile 5. 与文件描述字有关的重定向 UNIX/Linux 0 1 2 2> 2>> $ gcc m1.c 2> errfile C m1.c errfile 2 2> >>
第 4 章 Linux shell 程序设计 99 command $>file command file command > file 2>& 1 2>& 1 2>& file file shell 0 9 10 3 9 cmd 9 f1 $ cmd 9> f1 $cmd 3<& 5 3 5 cmd 4.5.4 注释 管道线和后台命令 1. 注释 shell # 4.2 shell #!#! shell C shell #! /bin/csh bash #! /bin/bash shell 2. 管道线 UNIX/Linux ls -l $HOME wc -l grep tail sort wc ls grep m?.c wc -l m C 3. 后台命令
100 Linux 教程 ( 第 4 版 ) C C $ gcc m1.c& & shell shell CPU CPU 4.5.5 命令执行操作符 1. 顺序执行 pwd who wc -l cd /usr/bin pwd ; who wc -l ; cd /usr/bin 2. 逻辑与 && 1 && 2 1 2 1 2 cp ex1 ex10 && rm ex1 ex1 ex10 ex1 0 0 && cmd1 && cmd2 && && cmdn 3. 逻辑或
第 4 章 Linux shell 程序设计 101 1 2 1 2 1 2 cat abc pwd abc && & 4.5.6 成组命令 shell {} ( ) 1.{ } 形式 {} $ { echo "User Report for ` date `. "; who ; } pr 2016-04-02 09:59 Page 1 User Report for 2016 04 02 09:59:26 CST mengqc :0 2016-04-02 09:27 mengqc pts/0 2016-04-02 09:27 mengqc pts/1 2016-04-02 09:27 {} echo who pr {} { } ; {} { echo "Report of users for ` date `. " echo echo "There are ` who wc -l ` users logged in. " echo who sort ; } pr {} 2.( ) 形式 (echo "Current directory is ` pwd `. " cd /home/mengqc ; ls -l ; cp m1 em1 && rm m1 cat em1) pr
102 Linux 教程 ( 第 4 版 ) ()() {} {} shell () shell () shell $ a="current value " ; export a export 4.6.10 $ echo $a current value $ ( a="new value-1 " ; echo $a ) new value-1 $ echo $a current value $ { a="new value-2 " ; echo $a ; } new value-2 $ echo $a new value-2 $ pwd /home/mengqc $ (cd /bin ; pwd ) /bin $ pwd /home/mengqc $ { cd /bin ; pwd ; } /bin $ pwd /bin 4.6 shell 变量 shell shell C shell shell shell 4.6.1 用户定义的变量 1. 变量名 shell