兄弟连Linux(八)--Shell基础
1、Shell概述
1.1 Shell是什么
Shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止,甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
1.2 Shell的分类
Bourne Shell:从1979年其Unix就开始使用,Bourne Shell的主文件名为sh。
C Shell:C Shell主要在BSD版的Unix系统中使用,其余发和C语言相类似而得名。
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括csh、tcsh
Bash:与sh建瓯让,现在使用的Linux就是使用Bash作为用户的基本Shell。
1.3 Linux支持的Shell
/etc/shells
2、Shell脚本的执行方式
2.1 echo 输出命令
$ echo -e [输出内容]
-e 支持反斜线控制的字符转换
\\ 输出\本身
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符。和“-n”选项一致
\e ESCAPE键
\f 换页符
\n 换行符
\r 回车键
\t 制表符,也就是Tab键
\v 垂直制表符
\0nnn 按照八进制ASCII码输出字符。其中0位数字0,nnn是三位八进制数
\xhh 按照十六进制ASCII码输出字符。其中hh是两位十六进制数
$ echo -e “ab\bc” 删除左侧字符
$ echo -e “a\tb\tc\nd\te\tf” 制表符与换行符
$ echo -e “\x61\t\x62\t\x63\n\x64\t\x65\t\x66” 按照十六进制ASCII码也同样可以输出
$ echo -e “\e[1;31m abcd \e[0m” 输出颜色:30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,36m=青色,37m=白色
2.2 第一个脚本
$ vi hello.sh
#!/bin/bash
#The first program
#Auther: shenchao (E-mail: [email protected])
echo -e “Mr. Shen Chao is the most honest man in LampBrother”
2.3 脚本执行
赋予执行权限,直接执行
chmod 755 hello.sh
/root/sh/hello 通过绝对路径方式执行
./hello.sh 通过在目录中,输入./文件名方式执行
通过Bash调用执行脚本
Bash hello.sh
3、Bash的基本功能
3.1 历史命令与命令不全
3.1.1 历史命令
$ history -cw [历史命令保存文件]
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
历史命令的调用
使用上、下箭头调用以前的历史命令
使用“!n”重复执行第n条历史命令
使用“!!”重复执行上一条命令
使用“!字串”重复执行最后一条以该字串开头的命令
3.1.2命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行不全。
3.2 命令别名与常用快捷键
3.2.1 命令别名
$ alias 别名=‘原命令’ 设定命令别名
$ alias 查询命令别名
命名执行顺序
第1顺位执行用绝对路径或相对路径执行的命令
第2顺位执行别名
第3顺位执行Bash内部命令
第4顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
让别名永久生效
$ vi /root/.bashrc
删除别名
$ unalias 别名
3.2.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 退出当前中断
Ctrl + Z 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍
Ctrl + S 暂停屏幕输出
Ctrl + Q 恢复屏幕输出
3.3 输入输出重定向
3.3.1 标准输入输出
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出
3.3.2 输出重定向
标准输出重定向
命令 > 文件 以覆盖的方式,把命令正确输出输出到指定文件或设备当中
命令 >> 文件 以追加的方式,把命令的正确输出输出到指定文件或设备当中
标准错误输出重定向
错误命令 2> 文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
错误命令 2>> 文件 以追加的方式,把命令的错误输出输出到指定的文件或设备当中
正确输出和错误输出同时保存
命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
命令 >> 文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
命令 &> 文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
命令 &>> 文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
命令>>文件1 2>>文件2 把正确的出书追加到文件1当中,把错误的输出追加到文件2当中
3.3.3 输入重定向 用的不多
$ wc -cwl [文件名]
-c 统计字节数
-w 统计单词数
-l 统计行数
命令<文件 把文件作为命令的输入
3.4 多命令顺序执行与管道符
3.4.1 多命令顺序执行
; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1&&命令2 逻辑与;当命令1正确执行,则命令2才会执行;当命令1执行不正确,则命令2不会执行
|| 命令1||命令2 逻辑或;当命令1执行不正确,则命令2才会执行;当命令1正确执行,则命令2不会执行
$ ls ; data ; cd/user ; pwd
$ dd if=输入文件 of=输出文件 bs=字节数 count=个数
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看成一个数据块
count=个数 指定输入/输出多少个数据块
$ date ; dd if=/dev/zero of=root/testfile bs=1k count=100000 ; date
$ ls anaconda-ks.cfg && echo yes
$ ls /root/test || echo no
$ 命令 && echo yes || echo no 判断这条命令是否正确
3.4.2 管道符
$ 命令1 | 命令2 命令1的正确输出作为命令2的操作对象
$ ll -a /etc/ | more
$ netstat -an | grep “ESTABLISHED”
$ grep -inv “搜索内容” 文件名
-i 忽略大小写
-n 输出行号
-v 反向查找
--color=auto 搜索出的关键字用颜色表示
3.5 通配符与其他特殊符号
3.5.1 通配符
? 匹配一个任意字符
* 匹配0个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c。
[-] 匹配中括号中任意一个字符,-代表一个范围。例如[a-z]代表匹配一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符
$ cd /tmp/
$ rm -rf *
$ touch abc
$ touch abcd
$ touch 012
$ touch 0abc
$ ls ?abc
$ ls [0-9]*
$ ls [^0-9]*
3.5.2 Bash 中其他特殊符号
‘’ 单引号。在单引号中所有的特殊字符,如“$”和“`”(反引号)都没有特殊含义
“” 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”、和“转义符”的特殊含义
`` 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号容易看错
$() 和反引号作用一样,用来引用系统命令
# 在Shell脚本中,#开头的行代表注释
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
\ 转义符。跟在“\”之后的特殊符号将失去特殊含义,变成普通字符。如\$将输出“$”符号,而不当做是变量引用
单引号与双引号
$ name=sc
$ echo ‘$name’
$ echo “$name”
$ echo ‘$(date)’
$ echo ‘$(date)’
反引号与$()
$ echo `ls`
$ echo $(date)
4、Bash的变量
4.1 用户自定义变量
4.1.1 什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,入一个文件名或一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很用以引用它。使用变量可以保存有用信息,是系统获知用户相关设置,变量也可以用于保存暂时信息。
4.1.2 变量设置规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的
在Bash中,变量的默认类型都是字符串型,如果要进行数值计算,则必需修改指定变量类型为数值型。
变量用等号连接值,等号左右两侧不能有空格
变量的值如果有空格,需要使用单引号或双引号包括
在变量的值中,可以使用“\”转义符
如果需要增加变量的值,那么可以进行变量值的叠加,不过变量需要用双引号包括“$变量名”或用${变量名}包含
如果是把命令的节骨哦作为变量值赋予变量,则需要使用反引号或$()包含命令
环境变量名建议大写,便于区分
4.1.3 变量分类
用户自定义变量
环境变量:这种变量中主要保存的是和系统操作环境相关的数据
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
预定义变量:是Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的
4.1.4本地变量
变量定义
$ name=”shenchao”
变量叠加
$ aa=123
$ aa=”$aa”456
$aa=${aa}789
变量调用
$ echo $name
变量查看
$ set
变量删除
$ unset name
4.2 环境变量
4.2.1 环境变量是什么
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
4.2.2设置环境变量
export 变量名=变量值 申明变量
env 查询变量
unset 变量名 删除变量
4.2.3 系统常见环境变量
PATH:系统查找命令的路径
$ 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”
\A 显示24小时制时间,格式为“HH:MM”
\u 显示当前用户名
\w 显示当前所在目录的完整名称
\W 显示当前所在目录的最后一个目录
\# 执行的第几个命令
\$ 提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”
$ PS1=’[\[email protected]\t \W]\$ ’
$ PS1=’[\[email protected]\@ \h \# \W]\$ ’
$ PS1=’[\u$\h \W]\$’
4.3 位置参数变量
4.3.1 位置参数变量
$n n位数字,$0代表命令本身,$1-$9代表第1到第9个参数,10以上的参数需要用大括号包含,如${10}
$* 这个变量代表命令行中所用参数,$*把所有的参数看成一个整体
[email protected] 这个变量也代表命令行中所有参数,不过[email protected]把每个参数区别对待
$# 这个变量代表命令行中所有参数的个数
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2)) 变量sum的值时num1和num2的和
echo $sum 达因变量sum的值
#!/bin/bash
echo “A total of $# parameters” 使用$#代表所有参数的个数
echo “The parameters is:$*” 使用$*代表所有的参数
echo “The parameters is [email protected]” 使用[email protected]也代表所有参数
$*和[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
4.4 预定义变量
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 $!”
4.4.2 接收键盘输入
$ read -ptns [变量名]
-p “提示信息” 在等待read输入时,输出提示信息
-t 秒数 read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数 read命令只接受指定的字符数,就会执行
-s 隐藏输入的数据,适用于机密信息的输入
5、Bash的运算符
5.1 数值运算与运算符
5.1.1 declare声明变量类型
$ declare [+/-] [选项] 变量名
- 给变量设定类型属性
+ 取消变量的类型属性
-i 将变量声明为整数型(integer)
-x 将变量声明为环境变量
-p 显示指定变量的被声明的类型
5.1.2 数值运算--方法1
$ aa=11 给变量aa和bb赋值
$ bb=22
$ declare -i cc=$aa+$bb
方法2:expr或let数值运算工具
$ aa=11 给变量aa和bb赋值
$ bb=22
$ dd=$(expr $aa + $bb) dd的值时aa和bb的和。注意“+”好左右两侧必须有空格
方法3:“$((运算式))”或$[运算式] 推荐使用!!
$ aa=11
$ bb=22
$ ff=$(($aa+$bb))
$ gg=$[$aa+$bb]
5.1.3 运算符
13 -,+ 单目负、单目正
12 !,~ 逻辑非、按位取反或补码
11 *,/,% 乘、除、取模
10 +,- 加、减
9 << , >> 按位左移、按位右移
8 < =, > =, <, > 大于或小于、大于或等于、小于、大于
7 ==, != 等于、不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 =, +=, -
=,*-,/=,%=,&=,^=, 赋值、运算且赋值
|=,<<=,>>=
5.2 变量测试与内容替换
变量置换方式 |
变量y没有设置 |
变量y为空值 |
变量y设置值 |
x=${y-新值} |
x=新值 |
x为空 |
x=$y |
x=${y:-新值} |
x=新值 |
x=新值 |
x=$y |
x=${y+新值} |
x为空 |
x=新值 |
x=新值 |
x=${y:+新值} |
x为空 |
x为空 |
x=新值 |
x=${y=新值} |
x=新值 y=新值 |
x为空 y值不变 |
x=$y y值不变 |
x=${y:=新值} |
x=新值 y=新值 |
x=新值 y=新值 |
x=$y y值不变 |
x=${y?新值} |
新值输入到标准错误输出(就是屏幕) |
x为空 |
x=$y |
x=${y:?新值} |
新值输出到标准错误输出 |
新值输出到标准错误输出 |
x=$y |
6、环境变量配置文件
6.1 环境变量配置文件简介
6.1.1 source命令
$ source 配置文件
或
$. 配置文件
6.1.2 环境变量配置文件简介
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。
/etc/profile
/etc/profiled.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
6.2 环境变量配置文件作用
/etc/profile的作用 声明环境变量,调用/etc/profile.d/*.sh文件
USER变量
LOGNAME变量
MAIL变量
PATH变量
HOSTNAME变量
HISTSIZE变量
umask
调用/etc/profile.d/*.sh文件(colorls.sh cvs.sh glib2.sh lang.sh(定义系统语言,调用/etc/systemconfig/i18n) less.sh qt.sh vim.sh)
/etc/sysconfig/i18n 编码:UTF-8
~/.bash_profile 调用~/.bashrc 添加/bin到PATH中
~/.bashrc 别名 调用/etc/bashrc
/etc/bashrc 命令提示符
6.3 其他配置文件和登录信息
6.3.1 注销时生效的环境配置文件
~/.bash.logout
6.3.2 其他配置文件
~/bash_history
6.3.3 Shell登录信息
本地终端欢迎信息: /etc/issue
\d 显示当前系统信息
\s 显示操作系统名称
\l 显示登录的终端号,这个比较常用
\m 显示硬件体系结构,如i386,i686等
\n 显示主机名
\o 显示域名
\r 显示内核版本
\t 显示当前系统时间
\u 显示当前登录用户的***
远程终端欢迎信息: /etc/issue.net
转移符号在/etc/issue.ent文件中不能使用
是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner/etc/issue.net”行才能显示,(记得重启SSH服务)
登陆后欢迎信息: /etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息