10.1 Shell概述1、Shell是什么Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。2、Shell的分类Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。C Shell: C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcshBash: Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。3、Linux支持的Shell/etc/shells exit 10.2 Shell脚本的执行方式1、echo输出命令 //有空格加双引号,如果里面有特殊字符,比如$$,这时要用单引号,不能用双引号。所以全部都加单引号更容易记住[root@localhost ~]# echo [选项] [输出内容]选项:-e: 支持反斜线控制的字符转换 控制字符 作 用\\ 输出\本身\a 输出警告音\b 退格键,也就是向左删除键\c 取消输出行末的换行符。和“-n”选项一致\e ESCAPE键\f 换页符\n 换行符\r 回车键\t 制表符,也就是Tab键\v 垂直制表符\0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数\xhh 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数[root@localhost ~]# echo -e "ab\bc" #删除左侧字符[root@localhost ~]# echo -e "a\tb\tc\nd\te\tf" #制表符与换行符[root@localhost ~]# echo -e \"\x61\t\x62\t\x63\n\x64\t\x65\t\x66" #按照十六进制ASCII码也同样可以输出[root@localhost ~]# echo -e "\e[1;31m abcd \e[0m" #输出颜色#30m=黑色,31m=红色,32m=绿色,33m=黄色#34m=蓝色,35m=洋红,36m=青色,37m=白色2、第一个脚本[root@localhost sh]# vi hello.sh#!/bin/bash //必须添加 bash 小写#The first program# Author: shenchao (E-mail: shenchao@lampbrother.net)echo -e "Mr. Shen Chao is the most honest man in LampBrother"3、脚本执行赋予执行权限,直接运行 chmod 755 hello.sh./hello.sh通过Bash调用执行脚本 bash hello.sh//dos2unix 从windows格式转换成为Linux格式10.3 Bash的基本功能10.3.1 历史命令与命令补全10.3.2 命令别名与常用快捷键10.3.3 输入输出重定向10.3.4 多命令顺序执行与管道符10.3.5 通配符与其他特殊符号10.3.1 历史命令与命令补全1、历史命令[root@localhost ~]# history [选项] [历史命令保存文件]选项:-c: 清空历史命令-w: 把缓存中的历史命令写入历史命令保存文件~/.bash_history历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改历史命令的调用使用上、下箭头调用以前的历史命令使用“!n”重复执行第n条历史命令使用“!!”重复执行上一条命令使用“!字串”重复执行最后一条以该字串开头的命令2、命令与文件补全在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全 //!!!熟练掌握tab。按一下没反应后说明有多个可能,再按一下显示所有相关的10.3.2 命令别名与常用快捷键1、命令别名[root@localhost ~]# alias 别名='原命令'#设定命令别名[root@localhost ~]# alias#查询命令别名命令执行时顺序1 第一顺位执行用绝对路径或相对路径执行的命令。2 第二顺位执行别名。3 第三顺位执行Bash的内部命令。4 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。让别名永久生效[root@localhost ~]# vi /root/.bashrc删除别名[root@localhost ~]# unalias 别名2、Bash常用快捷键快捷键作 用ctrl+A把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。ctrl+E把光标移动到命令行结尾。ctrl+C //!!!强制终止当前的命令。ctrl+L //!!!清屏,相当于clear命令。ctrl+U //!!!!删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便ctrl+K //我觉得这个也有用删除或剪切光标之后的内容。ctrl+Y //!!!粘贴ctrl+U或ctrl+K剪切的内容。ctrl+R在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。 //!!!ctrl+D //!!1退出当前终端。ctrl+Z暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍。ctrl+S暂停屏幕输出。ctrl+Q恢复屏幕输出。10.3.3 输入输出重定向1、标准输入输出设备 设备文件名 文件描述符 类型 键盘 /dev/stdin 0 标准输入 显示器 /dev/sdtout 1 标准输出显示器 /dev/sdterr 2 标准错误输出2、输出重定向类 型符 号作用标准输出重定向命令 > 文件以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。命令 >> 文件以追加的方式,把命令的正确输出输出到指定的文件或设备当中。标准错误输出重定向错误命令 2>文件以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。错误命令 2>>文件以追加的方式,把命令的错误输出输出到指定的文件或设备当中。正确输出和错误输出同时保存命令 > 文件 2>&1以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。命令 >> 文件 2>&1以追加的方式,把正确输出和错误输出都保存到同一个文件当中。命令 &>文件以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。命令 &>>文件以追加的方式,把正确输出和错误输出都保存到同一个文件当中。命令>>文件1 2>>文件2把正确的输出追加到文件1中,把错误的输出追加到文件2中。3、输入重定向[root@localhost ~]# wc [选项] [文件名]选项:-c 统计字节数-w 统计单词数-l 统计行数 //直接输入方式,回车后输入字符,以ctrl+d 结束命令 <文件 把文件作为命令的输入命令<< 标识符 … 把标识符之间内容作为 命令的输入 标识符可以是任何字符,就相当于上面以ctrl+d 结束,此处遇到标识符结束10.3.4 多命令顺序执行与管道符1、多命令顺序执行;&& ||例子:[root@localhost ~]# ls ; date cd user pwd[root@localhost dd="$(expr" if="/dev/zero" of bs="1k" count="100000" 指定源文件或源设备of="输出文件" 指定目标文件或目标设备bs="字节数" 指定一次输入 输出多少字节,即把这些字节看做 一个数据块count="个数" 指定输入 输出多少个数据块例子:[root@localhost date[root@localhost anaconda-ks.cfg && echo yes[root@localhost root test || "no[root@localhost 命令 yes no2、管道符命令格式:[root@localhost 命令1 | 命令2#命令1的正确输出作为命令2的操作对象颜色显示例子:[root@localhost ll -a etc more[root@localhost netstat -an grep "established" 双引号可以省略[root@localhost [选项] "搜索内容" 文件名选项:-i: 忽略大小写-n: 输出行号-v: 反向查找--color="auto" 搜索出的关键字用颜色显示10.3.5 通配符与其他特殊符号1、通配符[^][root@localhost tmp [root@localhost tmp]# rm -rf * 严禁这样写,删除当前目录所有内容。不如以rf都不用[root@localhost touch abc[root@localhost abcd[root@localhost 012[root@localhost 0abc[root@localhost ?abc 匹配一个字符[root@localhost [0-9]* 匹配任意一个字符[root@localhost [^0-9]* 匹配一个不是数字的字符2、bash中其他特殊符号符 号 作 用''单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义。""双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。``反引号。反引号括起来的内容是系统命令,在bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。$()和反引号作用一样,用来引用系统命令。#在shell脚本中,#开头的行代表注释。$用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用。反引号与$()[root@localhost `ls`[root@localhost $(date)单引号与双引号[root@localhost name="shen chao" '$name'[root@localhost "$name"[root@localhost ‘$(date)'[root@localhost “$(date)"10.4 bash的变量10.4.1 用户自定义变量10.4.2 环境变量10.4.3 位置参数变量10.4.4 预定义变量10.4.1 用户自定义变量1、什么是变量变量是计算机内存的单元,其中存放的值可以改变。当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。2、变量设置规则变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型变量用等号连接值,等号左右两侧不能有空格。变量的值如果有空格,需要使用单引号或双引号包括。在变量的值中,可以使用“\”转义符。如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。环境变量名建议大写,便于区分。3、变量分类用户自定义变量本地变量 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。预定义变量:是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。4、本地变量变量定义 变量叠加 aa="11[root@localhost" 456 $name变量查看 set变量删除 unset name10.4.2 环境变量1、环境变量是什么用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效2、设置环境变量 大写便于区分export 变量名="变量值#申明变量env#查询变量unset" 变量名#删除变量3、系统常见环境变量path:系统查找命令的路径 $path usr lib qt-3.3 bin: local sbin: bin path="$PATH" : sh #path变量叠加ps1:定义系统提示符的变量 \d:显示日期,格式为“星期 月 日” \h:显示简写主机名。如默认主机名“localhost” \t:显示24小时制时间,格式为“hh:mm:ss” \t:显示12小时制时间,格式为“hh:mm:ss” \a:显示24小时制时间,格式为“hh:mm” \u:显示当前用户名 \w:显示当前所在目录的完整名称 \w:显示当前所在目录的最后一个目录 \#:执行的第几个命令 \$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”举例:[root@localhost ps1="[\u@\t \w]\$ // 用单引号屏蔽 特殊符号" [root@04:50:08 src]#ps1="[\u@\@ \h \# \W]\$‘[root@04:53 上午 localhost 31 src]#PS1=" [\u@\h \w]\$ '10.4.3 位置参数变量1、位置参数变量位置参数变量作 用$nn为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${ 10}.$*这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体$@这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待$#这个变量代表命令行中所有参数的个数例子1:#! bin bashnum1="$1num2=$2sum=$((" $num1 + $num2))#变量sum的和是num1加num2echo $sum#打印变量sum的值例子2:#! bashecho "a total $# parameters"#使用$#代表所有参数的个数echo "the parameters is: $*"#使用$*代表所有的参数echo $@"#使用$@也代表所有参数例子3:$*与$@的区别#! bashfor i in "$*"#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次doecho $i"donex="1for" y "$@"#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次doecho parameter$x $y"x="$((" $x +1 ))doner10.4.4 预定义变量1、预定义变量预定义变量作 用$?最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。$$当前进程的进程号(pid)$!后台运行的最后一个进程的进程号(pid)#! bash# author: shenchao (e-mail: shenchao@lampbrother.net)echo current process is $$"#输出当前进程的pid。#这个pid就是variable.sh这个脚本执行时,生成的进程的pidfind -name hello.sh 使用find命令在root目录下查找hello.sh文件#符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍echo last one daemon $!"2、接收键盘输入[root@localhost read [变量名]选项:-p “提示信息”:在等待read输入时,输出提示信息-t 秒数: read命令会一直等待用户输入,使用 此选项可以指定等待时间-n 字符数: read命令只接受指定的字符数,就会 执行-s: 隐藏输入的数据,适用于机密信息的 输入#! shenchao@lampbrother.net)read -t 30 -p "please input your name: " name#提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中echo "name $name "read -s enter age: age#年龄是隐私,所以我们用“-s”选项隐藏输入echo -e "\n"echo "age $age -n 1 select gender[m f]: gender#使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车)echo "sex $gender"10.5 bash的运算符10.5.1 数值运算与运算符10.5.2 变量测试与内容替换10.5.1 数值运算与运算符10.5.1 数值运算与运算符1、declare声明变量类型[root@localhost declare [+ -][选项] 变量名选项:-: 给变量设定类型属性+: 取消变量的类型属性-i: 将变量声明为整数型(integer)-x: 将变量声明为环境变量-p: 显示指定变量的被声明的类型2、数值运算—方法1[root@localhost bb="22[root@localhost" -i cc="$aa+$bb方法2:expr或let数值运算工具[root@localhost" $aa $bb) 加号左右空格不能省略#dd的值是aa和bb的和。注意“+”号左右两侧必须有空格方法3:“$((运算式))”或“$[运算式]”[root@localhost ff="$((" $aa+$bb ))[root@localhost gg="$[" ]3、运算符优先级 运算符 说明13 -, 单目负、单目正12 !, ~ 逻辑非、按位取反或补码11 , % 乘、除、取模10 +, - 加、减9 <<> > 按位左移、按位右移8 < =, > =, < , > 小于或等于、大于或等于、小于、大于7 == , != 等于、不等于6 & 按位与5 ^ 按位异或4 | 按位或3 && 逻辑与2 || 逻辑或1 =,+=,-=,*=,/=,%=,&=, ^=, |=, <<=, >>= 赋值、运[root@localhost ~]# aa=$(( (11+3)*3/2 ))#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级[root@localhost ~]# bb=$(( 14%3 ))#14不能被3整除,余数是2[root@localhost ~]# cc=$(( 1 && 0 ))#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是010.5.2 变量测试与内容替换//这个表格需要时候参考就可以,不需要背 例子1:测试x=${y-新值}[root@localhost ~]# unset y#删除变量y[root@localhost ~]# x=${y-new}#进行测试[root@localhost ~]# echo $xnew#因为变量y不存在,所以x=new[root@localhost ~]# y=""#给变量y赋值为空[root@localhost ~]# x=${y-new}#进行测试[root@localhost ~]# echo $x[root@localhost ~]# y=old#给变量y赋值[root@localhost ~]# x=${y-new}#进行测试[root@localhost ~]# echo $xold10.6 环境变量配置文件10.6.1 环境变量配置文件简介10.6.2 环境变量配置文件作用10.6.3 其他配置文件和登录信息10.6.1 环境变量配置文件简介1、source命令 //让配置文件直接生效,而无需重启[root@localhost ~]# source 配置文件或[root@localhost ~]# . 配置文件2、环境变量配置文件简介环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量/etc/profile/etc/profile.d/*.sh~/.bash_profile~/.bashrc/etc/bashrc10.6.2 环境变量配置文件作用/etc/profile/etc/profile.d/*.sh~/.bash_profile // ~/ 表示用户家目录,可能是root用户,也可以是其他用户~/.bashrc/etc/bashrcpicture.............../etc/profile的作用:USER变量:LOGNAME变量:MAIL变量:PATH变量:HOSTNAME变量:HISTSIZE变量:umask:调用/etc/profile.d/*.sh文件~/.bash_profile的作用调用了~/.bashrc文件。在PATH变量后面加入了“:$HOME/bin”这个目录~/.bashrc的作用定义默认别名调用/etc/bashrc/etc/bashrc的作用 //这个文件是定义非登录状态的。eg,直接用bash进入的,而非通过用户密码登录进入的PS1变量umaskPATH变量调用/etc/profile.d/*.sh文件10.6.3 其他配置文件和登录信息1、注销时生效的环境变量配置文件~/.bash_logout2、其他配置文件~/bash_history3、Shell登录信息本地终端欢迎信息: /etc/issue转义符 作 用\d 显示当前系统日期\s 显示操作系统名称\l 显示登录的终端号,这个比较常用。\m 显示硬件体系结构,如i386、i686等\n 显示主机名\o 显示域名\r 显示内核版本\t 显示当前系统时间\u 显示当前登录用户的序列号远程终端欢迎信息: /etc/issue.net转义符在/etc/issue.net文件中不能使用是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务):// service sshd restart登陆后欢迎信息:/etc/motd 不管是本地登录,还是远程登录,都可以显示此欢迎信息 文件>