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、tcsh ?Bash: Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。 3、Linux支持的Shell ?/etc/shells exit 10.2 Shell脚本的执行方式 1、echo输出命令 //有空格加双引号,如果里面有特殊字符,比如$$,这时要用单引号,不能用双引号。所以全部都加单引号更容易记住 [[email protected] ~]# echo [选项] [输出内容] 选项: -e: 支持反斜线控制的字符转换 控制字符 作 用 \\ 输出\本身 \a 输出警告音 \b 退格键,也就是向左删除键 \c 取消输出行末的换行符。和“-n”选项一致 \e ESCAPE键 \f 换页符 \n 换行符 \r 回车键 \t 制表符,也就是Tab键 \v 垂直制表符 \0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 \xhh 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 [[email protected] ~]# echo -e "ab\bc" #删除左侧字符 [[email protected] ~]# echo -e "a\tb\tc\nd\te\tf" #制表符与换行符 [[email protected] ~]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66" #按照十六进制ASCII码也同样可以输出 [[email protected] ~]# echo -e "\e[1;31m abcd \e[0m" #输出颜色 #30m=黑色,31m=红色,32m=绿色,33m=黄色 #34m=蓝色,35m=洋红,36m=青色,37m=白色 2、第一个脚本 [[email protected] sh]# vi hello.sh #!/bin/bash //必须添加 bash 小写 #The first program # Author: shenchao (E-mail: [email protected]) 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、历史命令 [[email protected] ~]# history [选项] [历史命令保存文件] 选项: -c: 清空历史命令 -w: 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history ?历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改 历史命令的调用 ?使用上、下箭头调用以前的历史命令 ?使用“!n”重复执行第n条历史命令 ?使用“!!”重复执行上一条命令 ?使用“!字串”重复执行最后一条以该字串开头的命令 2、命令与文件补全 ?在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全 //!!!熟练掌握tab。按一下没反应后说明有多个可能,再按一下显示所有相关的 10.3.2 命令别名与常用快捷键 1、命令别名 [[email protected] ~]# alias 别名=‘原命令‘ #设定命令别名 [[email protected]calhost ~]# alias #查询命令别名 命令执行时顺序 1 第一顺位执行用绝对路径或相对路径执行的命令。 2 第二顺位执行别名。 3 第三顺位执行Bash的内部命令。 4 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。 让别名永久生效 [[email protected] ~]# vi /root/.bashrc 删除别名 [[email protected] ~]# 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、输入重定向 [[email protected] ~]# wc [选项] [文件名] 选项: -c 统计字节数 -w 统计单词数 -l 统计行数 //直接输入方式,回车后输入字符,以ctrl+d 结束 ?命令<文件 把文件作为命令的输入 ?命令<< 标识符 … 标识符 把标识符之间内容作为 命令的输入// 标识符可以是任何字符,就相当于上面以ctrl+d 结束,此处遇到标识符结束 10.3.4 多命令顺序执行与管道符 1、多命令顺序执行 ;&& || 例子: [[email protected] ~]# ls ; date ; cd /user ; pwd [[email protected] ~]# dd if=输入文件 of=输出文件 bs=字节数 count=个数 选项: if=输入文件 指定源文件或源设备 of=输出文件 指定目标文件或目标设备 bs=字节数 指定一次输入/输出多少字节,即把这些字节看做 一个数据块 count=个数 指定输入/输出多少个数据块 例子: [[email protected] ~]# date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date [[email protected] ~]# ls anaconda-ks.cfg && echo yes [[email protected] ~]# ls /root/test || echo "no [[email protected] ~]# 命令 && echo yes || echo no 2、管道符 命令格式: [[email protected] ~]# 命令1 | 命令2 #命令1的正确输出作为命令2的操作对象 颜色显示 例子: [[email protected] ~]# ll -a /etc/ | more [[email protected] ~]# netstat -an | grep "ESTABLISHED" //双引号可以省略 [[email protected] ~]# grep [选项] "搜索内容" 文件名 选项: -i: 忽略大小写 -n: 输出行号 -v: 反向查找 --color=auto 搜索出的关键字用颜色显示 10.3.5 通配符与其他特殊符号 1、通配符 [^] [[email protected] ~]# cd /tmp/ [[email protected] tmp]# rm -rf * //严禁这样写,删除当前目录所有内容。不如以rf都不用 [[email protected] tmp]# touch abc [[email protected] tmp]# touch abcd [[email protected] tmp]# touch 012 [[email protected] tmp]# touch 0abc [[email protected] tmp]# ls ?abc //匹配一个字符 [[email protected] tmp]# ls [0-9]* //匹配任意一个字符 [[email protected] tmp]# ls [^0-9]* //匹配一个不是数字的字符 2、Bash中其他特殊符号 符 号 作 用 ‘‘ 单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义。 "" 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。 `` 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。 $() 和反引号作用一样,用来引用系统命令。 # 在Shell脚本中,#开头的行代表注释。 $ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用。 反引号与$() [[email protected] ~]# echo `ls` [[email protected] ~]# echo $(date) 单引号与双引号 [[email protected] ~]# name=sc [[email protected] ~]# echo ‘$name‘ [[email protected] ~]# echo "$name" [[email protected] ~]# echo ‘$(date)‘ [[email protected] ~]# echo “$(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、本地变量 ?变量定义 [[email protected] ~]# name="shen chao" ?变量叠加 [[email protected] ~]# aa=123 [[email protected] ~]# aa="$aa"456 [[email protected] ~]# aa=${aa}789 ?变量调用 [[email protected] ~]# echo $name ?变量查看 [[email protected] ~]# set ?变量删除 [[email protected] ~]# unset name 10.4.2 环境变量 1、环境变量是什么 ?用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效 2、设置环境变量 // 大写便于区分 export 变量名=变量值 #申明变量 env #查询变量 unset 变量名 #删除变量 3、系统常见环境变量 ?PATH:系统查找命令的路径 [[email protected] ~]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin: /sbin:/bin:/usr/sbin:/usr/bin:/root/bin ? PATH="$PATH":/root/sh #PATH变量叠加 ?PS1:定义系统提示符的变量 \d:显示日期,格式为“星期 月 日” \h:显示简写主机名。如默认主机名“localhost” \t:显示24小时制时间,格式为“HH:MM:SS” \T:显示12小时制时间,格式为“HH:MM:SS” \A:显示24小时制时间,格式为“HH:MM” \u:显示当前用户名 \w:显示当前所在目录的完整名称 \W:显示当前所在目录的最后一个目录 \#:执行的第几个命令 \$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$” 举例: ?[[email protected] ~]# PS1=‘[\[email protected]\t \w]\$ // 用单引号屏蔽 特殊符号‘ ?[[email protected]04:50:08 /usr/local/src]#PS1=‘[\[email protected]\@ \h \# \W]\$‘ ?[[email protected]04:53 上午 localhost 31 src]#PS1=‘[\[email protected]\h \W]\$ ‘ 10.4.3 位置参数变量 1、位置参数变量 位置参数变量 作 用 $n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}. $* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 [email protected] 这个变量也代表命令行中所有的参数,不过[email protected]把每个参数区分对待 $# 这个变量代表命令行中所有参数的个数 例子1: #!/bin/bash num1=$1 num2=$2 sum=$(( $num1 + $num2)) #变量sum的和是num1加num2 echo $sum #打印变量sum的值 例子2: #!/bin/bash echo "A total of $# parameters" #使用$#代表所有参数的个数 echo "The parameters is: $*" #使用$*代表所有的参数 echo "The parameters is: [email protected]" #使用[email protected]也代表所有参数 例子3:$*与[email protected]的区别 #!/bin/bash for i in "$*" #$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 do echo "The parameters is: $i" done x=1 for y in "[email protected]" #[email protected]中的每个参数都看成是独立的,所以“[email protected]”中有几个参数,就会循环几次 do echo "The parameter$x is: $y" x=$(( $x +1 )) done r10.4.4 预定义变量 1、预定义变量 预定义变量 作 用 $? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。 $$ 当前进程的进程号(PID) $! 后台运行的最后一个进程的进程号(PID) #!/bin/bash # Author: shenchao (E-mail: [email protected]) echo "The current process is $$" #输出当前进程的PID。 #这个PID就是variable.sh这个脚本执行时,生成的进程的PID find /root -name hello.sh & #使用find命令在root目录下查找hello.sh文件 #符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍 echo "The last one Daemon process is $!" 2、接收键盘输入 [[email protected] ~]# read [选项] [变量名] 选项: -p “提示信息”:在等待read输入时,输出提示信息 -t 秒数: read命令会一直等待用户输入,使用 此选项可以指定等待时间 -n 字符数: read命令只接受指定的字符数,就会 执行 -s: 隐藏输入的数据,适用于机密信息的 输入 #!/bin/bash # Author: shenchao (E-mail: [email protected]) read -t 30 -p "Please input your name: " name #提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中 echo "Name is $name " read -s -t 30 -p "Please enter your age: " age #年龄是隐私,所以我们用“-s”选项隐藏输入 echo -e "\n" echo "Age is $age " read -n 1 -t 30 -p "Please select your gender[M/F]: " gender #使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车) echo -e "\n" echo "Sex is $gender" 10.5 Bash的运算符 10.5.1 数值运算与运算符 10.5.2 变量测试与内容替换 10.5.1 数值运算与运算符 10.5.1 数值运算与运算符 1、declare声明变量类型 [[email protected] ~]# declare [+/-][选项] 变量名 选项: -: 给变量设定类型属性 +: 取消变量的类型属性 -i: 将变量声明为整数型(integer) -x: 将变量声明为环境变量 -p: 显示指定变量的被声明的类型 2、数值运算—方法1 [[email protected] ~]# aa=11 [[email protected] ~]# bb=22 #给变量aa和bb赋值 [[email protected] ~]# declare -i cc=$aa+$bb 方法2:expr或let数值运算工具 [[email protected] ~]# aa=11 [[email protected] ~]# bb=22 #给变量aa和变量bb赋值 [[email protected] ~]# dd=$(expr $aa + $bb) //加号左右空格不能省略 #dd的值是aa和bb的和。注意“+”号左右两侧必须有空格 方法3:“$((运算式))”或“$[运算式]” [[email protected] ~]# aa=11 [[email protected] ~]# bb=22 [[email protected] ~]# ff=$(( $aa+$bb )) [[email protected] ~]# gg=$[ $aa+$bb ] 3、运算符 优先级 运算符 说明 13 -, + 单目负、单目正 12 !, ~ 逻辑非、按位取反或补码 11 * , / , % 乘、除、取模 10 +, - 加、减 9 << , >> 按位左移、按位右移 8 < =, > =, < , > 小于或等于、大于或等于、小于、大于 7 == , != 等于、不等于 6 & 按位与 5 ^ 按位异或 4 | 按位或 3 && 逻辑与 2 || 逻辑或 1 =,+=,-=,*=,/=,%=,&=, ^=, |=, <<=, >>= 赋值、运 [[email protected] ~]# aa=$(( (11+3)*3/2 )) #虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级 [[email protected] ~]# bb=$(( 14%3 )) #14不能被3整除,余数是2 [[email protected] ~]# cc=$(( 1 && 0 )) #逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0 10.5.2 变量测试与内容替换 //这个表格需要时候参考就可以,不需要背 例子1:测试x=${y-新值} [[email protected] ~]# unset y #删除变量y [[email protected] ~]# x=${y-new} #进行测试 [[email protected] ~]# echo $x new #因为变量y不存在,所以x=new [[email protected] ~]# y="" #给变量y赋值为空 [[email protected] ~]# x=${y-new} #进行测试 [[email protected] ~]# echo $x [[email protected] ~]# y=old #给变量y赋值 [[email protected] ~]# x=${y-new} #进行测试 [[email protected] ~]# echo $x old 10.6 环境变量配置文件 10.6.1 环境变量配置文件简介 10.6.2 环境变量配置文件作用 10.6.3 其他配置文件和登录信息 10.6.1 环境变量配置文件简介 1、source命令 //让配置文件直接生效,而无需重启 [[email protected] ~]# source 配置文件 或 [[email protected] ~]# . 配置文件 2、环境变量配置文件简介 ?环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量 ?/etc/profile ?/etc/profile.d/*.sh ?~/.bash_profile ?~/.bashrc ?/etc/bashrc 10.6.2 环境变量配置文件作用 ?/etc/profile ?/etc/profile.d/*.sh ?~/.bash_profile // ~/ 表示用户家目录,可能是root用户,也可以是其他用户 ?~/.bashrc ?/etc/bashrc picture............... /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变量 ?umask ?PATH变量 ?调用/etc/profile.d/*.sh文件 10.6.3 其他配置文件和登录信息 1、注销时生效的环境变量配置文件 ?~/.bash_logout 2、其他配置文件 ?~/bash_history 3、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 不管是本地登录,还是远程登录,都可以显示此欢迎信息
时间: 2024-10-13 00:29:11