• 1. Shell 编程Shell基础编程
  • 2. 主要内容shell介绍 shell基本语法 shell常用语句
  • 3. Shell介绍UNIX的shell程序解释用户的命令,不管是用户直接输入的或者从一个称作Shell脚本或者Shell程序文件读入。 Shell脚本是解释型的,而不是编译型的。Shell从脚本行的每行读取命令并在系统中搜索这些命令,当编译器把一个程序转化为可供机器读取的形式时,那么它就可以被以一个可执行文件用在shell脚本当中。 除了向内核传送命令之外,shell的主要任务是提供一个可单独配置的使用shell资源配置文件的用户环境。
  • 4. Shell类型 sh 或者称作 Bourne Shell: 最初的shell并且仍然在UNIX系统和UNIX相关系统中使用。它是基本的shell,是一个特性不多的小程序。虽然不是一个标准的shell,但是为了UNIX程序的兼容性在每个Linux系统上仍然存在。 bash 或者称作 Bourne Again shell: 标准的GNU shell,直观而又灵活。或许是初学者的最明智选择同时对高级和专业用户来说也是一个强有力的工具。在Linux上,bash 是普通用户的标准shell。这个shell因此称为Bourne shell的超集,一套附件和插件。意味着bash和sh是兼容的:在sh中可以工作的命令,在bash中也能工作,反之则不然。 csh 或者称作 C shell: 语法了类似于C语言,某些时候程序员会使用。 tcsh 或者称作 Turbo C shell: 普通C shell的超集,加强了的用户友好度和速度。 ksh 或者称作 Korn shell: 某些时候被有UNIX背景的人所赏识。Bourne shell的一个超集,有着对初学者来说就是一场恶梦的标准配置。 文件 /etc/shells
  • 5. 一个简单的shell脚本#!/bin/bash //shell脚本的开始 clear echo “Hello, $USER“ //打印用户信息 echo echo “Today‘s date is `date`“ //显示日期和时间 echo echo “The user is :“ //提示信息 who //who命令 echo echo “This is `uname -s`“ //cpu信息 echo echo "That's all folks!"
  • 6. Shell如何执行命令执行交互式命令 外部命令 内建命令 执行脚本的方式: Sh 脚本文件 先chmod +x脚本文件 再./脚本 例如: #!/bin/sh cd .. ls
  • 7. 启动脚本/etc/profile:  此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。 /etc/bashrc:  为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取。 ~/.bash_profile: 当用户登录时,该文件仅仅执行一次! 通常情况下该脚本会去调用~/.bashrc。 ~/.bashrc: 该文件包含个人的bash shell的bash信息,通常情况下该脚本中会去调用/etc/bashrc。 ~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件。
  • 8. Shell基本语法变量 环境变量(可以从父进程传给子进程,常用env查看) 本地变量(只存在于当前shell进程,用set可以显示) 设置变量: VAR=value(本地变量) export VAR或者export VAR=value(导入成环境变量) unset命令用户删除已经定义的环境变量或本地变量 使用$VAR或者${VAR}可以取出变量的值,例如: [root@baozong myshell]# echo $SHELL /bin/bash [root@baozong myshell]# echo $SHELLabc [root@baozong myshell]# echo $SHELL abc /bin/bash abc [root@baozong myshell]# echo ${SHELL} abc /bin/bash abc [root@baozong myshell]# echo ${SHELL}abc /bin/bashabc
  • 9. 变量的定义与删除变量定义的时候不允许有空格 例如:STRING=“my name”
  • 10. 导出变量Exporting 一个子shell能够改变从父shell变量继承过来的变量,但是在子shell所作的改变对父shell也没有影响
  • 11. Bourne shell保留变量 变量名字定义CDPATH一个由冒号分割的目录列表作为内建命令 cd 的搜索路径。 HOME当前用户的home目录;默认为内建命令 cd 。这个变量的值同样被~扩展使用。 IFS分割域的一个字符的列表;用于shell把词分开作为扩展。MAIL如果这个变量设成一个文件名并且 MAILPATH 变量没有设置,Bash在指定文件中通知用户邮件的到达。 MAILPATH一个用冒号分隔的文件名列表,shell周期性地从这个文件里检测新邮件。OPTARGgetopts 内建命令处理的最后的选项参数的值。 OPTIND最后一个由 getopts 内建命令处理的选项参数的索引号。 PATH一个用冒号分隔的目录列表,shell从这些目录里寻找命令。PS1主要提示符。默认值是 “'\s-\v\$ '”。 PS2次要提示符。默认值是 “‘> ’”。 (输入换行\时出现)
  • 12. 变量名定义auto_resume这个变量控制shell如何与用户交互和作业控制。BASH用于执行当前Bash实例的全路径。BASH_ENV如果这个变量在Bash调用执行一个shell脚本时已被设置,它的值将被展开并用作在执行脚本前读取的启动文件名。BASH_VERSION当前Bash实例的版本号。BASH_VERSINFO一个只读变量数组,它的成员保存这个Bash实例的版本信息。COLUMNSselect 内建命令来决定打印选择列表时终端宽度。在收到 SIGWINCH 信号时自动设置。 COMP_CWORD包含当前光标位置的字的 ${COMP_WORDS} 的一个索引。An index into ${COMP_WORDS} of the word containing the current cursor position. COMP_LINE当前命令行。COMP_POINT指明相对于当前命令起点的当前光标位置。COMP_WORDS一个由当前命令行中单个词组成的变量数组。COMPREPLY一个变量数组,Bash从中读取由一个可编程完整设备调用的一个shell函数生成的可能的完成。An array variable from which Bash reads the possible completions generated by a shell function invoked by the programmable completion facility. DIRSTACK一个保存当前目录栈内容的变量数组。Bourne shell保留变量
  • 13. 字符定义$*展开为位置参数,从1开始。当扩展发生在双引号时,它展开成一个单独的词,每个参数的值由 IFS 特殊变量的第一个字符分隔。 $@展开为位置参数,从1开始。当在双引号里展开时,每个参数展开成独立的词。$#把位置参数展开为十进制数字。$?展开成最近执行的前台管道程序的退出状态。$-一个连字符展开为当前选项标志 内部命令集 或者那些shell自己的集(如-i)$$展开成shell的进程ID。$!展开成最近在后台(异步)执行的命令的进程ID。$0展开成shell或者shell脚本名。$_下划线变量在shell启动时设置,包含shell的绝对文件名或者作为参数列表被执行的脚本。随后,它展开为前一个命令扩展后的最后一个参数。它同样设置为每个执行程序的全路径,放在那个命令的输出环境中。当检查邮件时,这个参数保存邮件文件的名字。特殊Bash变量
  • 14. 文件名替换用于匹配的字符称为通配符,例如: * 匹配零个或者多个任意字符 ? 匹配一个任意字符 [若干字符]匹配方括号中任意一个字符一次出现 如: Ls /dev/ttyS* Ls cheng0?.txt Ls cheng[0-2].txt Ls cheng[012][0-9].txt
  • 15. 命令替换命令替换允许一个命令的输出来替换这个命令本身。命令替换在一个命令这样封装的时候发生: $(command) 或`command` 如: date=`date` Echo $date 或者 date=$(date) Echo $date
  • 16. 转义字符 转义字符:“\”
  • 17. 单引号与双引号单引号(‘’)用于保持在引号内的每个字符的字面值。 双引号保持引号内的所有字符的字面值,除了$,``,\
  • 18. Shell的输入与输出echo常见-n(禁用转义字符) –e(可以使用转义字符) #!/bin/sh echo -e "this 3 lines\n\n\n" echo "ok" echo "enter you name:" read name echo "enter you passwd:" read passwd echo $name $passwd
  • 19. 算术替换用于算术计算:$(())中的shell变量取值将换成整数,如: var=45 echo $(($var+3)) 注意只能用+-*/和(),并且只能做整数计算。
  • 20. 别名:alias一个别名允许使用一个字符串来代替一个字当它作为一个简单命令的第一个字时候。shell维护一个可以用 alias 和 unalias 内建命令来设置或者取消的别名列表。用 alias 命令而不带选项的时候可以显示当前shell所知的别名列表。
  • 21. shell的历史记录 history ~/bash_history文件中 !n 执行history中第n条指令 !! 执行history中最后一条指令 !str 执行history中最后以str开头的命令 注意:Shell具有的补全功能,请大家利用好。
  • 22. Shell脚本语法条件测试:test或者[] 可以用test或者[]测试一个条件是否成立,如果测试结果为真,则该命令退出状态为0,如果为假,状态为1。
  • 23. test文件测试 格式:test option file 或者[ option file ] -b file 块文件 -c file 字符文件 -d file 目录 -e file      存在 -p file      管道 -r file      可读 -s file      大于0 -w file      可写 -x file      可执行 f1 -ef f2    f1和f2被链接,指向同一文件(Korsh shell) f1 -nt f2    f1比f2新 f1 -ot f2    f1比f2旧
  • 24. test-a 逻辑与,操作符两边均为真,结果为真,否则为假。 -o 逻辑或,操作符两边一边为真,结果为真,否则为假。 ! 逻辑否,条件为假,结果为真。
  • 25. test整数比较 格式:test int1 operator int2 -eq 数值相等。 -ne 数值不相等。 -gt 第一个数大于第二个数。 -lt 第一个数小于第二个数。 -le 第一个数小于等于第二个数。 -ge 第一个数大于等于第二个数。 n1 -eq n2 n1和n2相等 n1 -ge n2 n1大于或者等于n2 n1 -gt n2 n1大于n2 n1 -le n2 n1小于或者等于n2 n1 -lt n2 n1小于n2 n1 -ne n2 n1不等于n2
  • 26. test字符串测试 格式:test option string或者[option string] = 两个字符串相等。 != 两个字符串不等。 -z 空串。 -n 非空串。 s1 = s2 相等 s1 != s2 s1与s2不同 s1 < s2 s1的ASCII在s2前 s2 > s2    s1的ASCII在s2后
  • 27. If语句i f语句测试条件,测试条件返回真( 0)或假(1)后,可相应执行一系列语句。 简单的if语句是: i f条件 then 命令 f i 注意:使用i f语句时,必须将t h e n部分放在新行,否则会产生错误。如果要不分行,必须使用命令分隔符。现在简单i f语句变为: if 条件;t h e n 命令 f i
  • 28. If语句i f语句其格式为: if 条件1 then 命令1 elif 条件2 then 命令2 else 命令3 f i If 条件1 如果条件1为真 Then 那么命令1 执行命令1 elif 条件2 如果条件1不成立 then 那么命令2 执行命令2 else 如果条件1,2均不成立命令3 那么执行命令3 fi 结束
  • 29. case语句c a s e语句为多选择语句。可以用c a s e语句匹配一个值与一个模式,如果匹配成功,执行相 匹配的命令。c a s e语句格式如下: case 值 i n 模式1 ) 命令1 . . . ;; 模式2) 命令2 . . . ;; e s a c
  • 30. case语句取值后面必须为单词i n,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;; 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号*捕获该值,再接受其他输入。 模式部分可能包括元字符,与在命令行文件扩展名例子中使用过的匹配模式类型相同,即: * 任意字符。 ? 任意单字符。 [..] 类或范围中任意字符。
  • 31. for循环 f o r循环一般格式为: for 变量名 i n 列表 d o 命令1 命令2⋯ d o n e 当变量值在列表里, f o r循环即执行一次所有命令,使用变量名访问列表中取值。命令可为任何有效的s h e l l命令和语句。变量名为任何单词。 i n列表用法是可选的,如果不用它, f o r循环使用命令行的位置参数。 i n列表可以包含替换、字符串和文件名,下面看一些例子。
  • 32. while循环w h i l e循环用于不断执行一系列命令,也用于从输入文件中读取数据,其格式为: while 命令 d o 命令1 命令2 . . . d o n e