Shell基础
第十讲 Shell基础
10.1 Shell概述
1、Shell是什么
uShell是一个命令行解释器,它为用户提供 了一个向Linux内核发送请求以便运行程
序的界面系统级程序,用户可以用Shell来 启动、挂起、停止甚至是编写一些程序。
内核是不能识别命令的,如ls,而是通过shell翻译成机器语言(0,1),再来操作硬件;执行完后的结果。通过shell把机器语言翻译成可识别的结果
uShell还是一个功能相当强大的编程语言, 易编写,易调试,灵活性较强。Shell是解 释执行(不需要先单独编译,而是在执行的时候编译)的脚本语言,在Shell中可以直接调 用Linux系统命令。
2、Shell的分类
uBourne Shell:从1979起Unix就开始使用 Bourne Shell,Bourne Shell的主文件名为sh。
uC Shell: C Shell主要在BSD版的Unix系 统中使用,其语法和C语言相类似而得名
uShell的两种主要语法类型有Bourne和C, 这两种语法彼此不兼容。Bourne家族主要
包括sh、ksh、Bash、psh、zsh;C家族主 要包括:csh、tcsh
uBash: Bash与sh兼容,现在使用的Linux 就是使用Bash作为用户的基本Shell。
3、查看Linux支持的Shell
u/etc/shells
10.2 Shell脚本的执行方式
1、echo输出命令
[root@localhost ~]# echo [选项] [输出内容] 选项:
-e: 支持反斜线控制的字符转换
[root@localhost ~]# echo -e "ab\bc" #删除左侧字符 ac
[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
#The first program
# Author: shenchao (E-mail: shenchao@lampbrother.net)
echo -e "Mr. Shen Chao is the most honest man in LampBrother"
说明:
#!/bin/bash 申明以下写的程序是shell脚本,注意小写,否则:
-bash: ./hello.sh: /bin/Bash: bad interpreter: No such file or directory
3、脚本执行
u赋予执行权限,直接运行 Ø chmod 755 hello.sh
Ø ./hello.sh
u通过Bash调用执行脚本(可不赋予执行权限)
Ø bash hello.sh
win下编写的脚本换行符和Linux下不一样,Linux下是$ cat -A xxx 可查看
10.3 Bash的基本功能
10.3.1 历史命令与命令补全
1、历史命令
[root@localhost ~]# history [选项] [历史命令保存文件] 选项:
-c: 清空历史命令
-w: 把缓存中的历史命令写入历史命令保存文件
~/.bash_history
默认保存在家目录下
u历史命令默认会保存1000条,可以在环境 变量配置文件/etc/profile中进行修改
历史命令的调用
u使用上、下箭头调用以前的历史命令
u使用“!n”重复执行第n条历史命令
u使用“!!”重复执行上一条命令
u使用“!字串”重复执行最后一条以该字串开头的命令
2、命令与文件补全
u在Bash中,命令与文件补全是非常方便与 常用的功能,我们只要在输入命令或文件 时,按“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常用快捷键
10.3.3 输入输出重定向
1、标准输入输出
2、输出重定向
3、输入重定向 (不常用,了解)
[root@localhost ~]# wc [选项] [文件名] 选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
u命令<文件 把文件作为命令的输入
u命令<< 标识符 …
标识符 把标识符之间内容作为命令的输入
10.3.4 多命令顺序执行与管道符
1、多命令顺序执行
例子:
[root@localhost ~]# ls ; date ; cd /user ; pwd
[root@localhost ~]# dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项:
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 指定输入/输出多少个数据块
例子:
[root@localhost ~]# date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ;date
[root@localhost ~]# ls anaconda-ks.cfg && echo yes
[root@localhost ~]# ls /root/test || echo "no
[root@localhost ~]# 命令 && echo yes || echo no
2、管道符
命令格式:
[root@localhost ~]# 命令1 | 命令2 #命令1的正确输出作为命令2的操作对象
颜色显示
例子:
[root@localhost ~]# ll -a /etc/ | more
[root@localhost ~]# netstat -an | grep "ESTABLISHED"
[root@localhost ~]# grep [选项] "搜索内容" 文件名
选项:
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
--color=auto 搜索出的关键字用颜色显示
10.3.5 通配符与其他特殊符号
1、通配符
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# rm -rf *
[root@localhost tmp]# touch abc
[root@localhost tmp]# touch abcd
[root@localhost tmp]# touch 012
[root@localhost tmp]# touch 0abc
[root@localhost tmp]# ls ?abc
[root@localhost tmp]# ls [0-9]*
[root@localhost tmp]# ls [^0-9]*
2、Bash中其他特殊符号
反引号与$()
[root@localhost ~]# echo `ls`
[root@localhost ~]# echo $(date)
单引号与双引号
[root@localhost ~]# name=sc
[root@localhost ~]# echo '$name'
[root@localhost ~]# echo "$name"
[root@localhost ~]# echo ‘$(date)'
[root@localhost ~]# echo “$(date)"
10.4 Bash的变量
10.4.1 用户自定义变量
1、什么是变量
u变量是计算机内存的单元,其中存放的值 可以改变。当Shell脚本需要保存一些信息 时,如一个文件名或是一个数字,就把它 存放在一个变量中。每个变量有一个名字 ,所以很容易引用它。使用变量可以保存 有用信息,使系统获知用户相关设置,变 量也可以用于保存暂时信息。
2、变量设置规则
u变量名称可以由字母、数字和下划线组成 ,但是不能以数字开头。如果变量名是“2name”则是错误的。
u在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量 类型为数值型。
u变量用等号连接值,等号左右两侧不能有空格。
u变量的值如果有空格,需要使用单引号或 双引号包括。
u在变量的值中,可以使用“\”转义符。
u如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含 “$变量名”或用${变量名}包含。
u如果是把命令的结果作为变量值赋予变量 ,则需要使用反引号或$()包含命令。
u环境变量名建议大写,便于区分。
3、变量分类
u 用户自定义变量
u 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
u 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变 量作用是固定的。
u 预定义变量:是Bash中已经定义好的变量,变 量名不能自定义,变量作用也是固定的。
4、本地变量
u变量定义
[root@localhost ~]# name="shen chao"
u变量叠加
[root@localhost ~]# aa=123
[root@localhost ~]# aa="$aa"456
[root@localhost ~]# aa=${aa}789
u变量调用
[root@localhost ~]# echo $name
u变量查看
[root@localhost ~]# set
u变量删除
[root@localhost ~]# unset name
10.4.2 环境变量
1、环境变量是什么
u用户自定义变量只在当前的Shell中生效, 而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效
确定进程数
2、设置环境变量
export 变量名=变量值 #申明变量
env #查询变量
unset 变量名 #删除变量
3、系统常见环境变量
uPATH:系统查找命令的路径(在这路径下的命令可以不用绝对路径或相对路径而直接执行)
[root@localhost ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:
/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
u PATH="$PATH":/root/sh #PATH变量叠加
uPS1:定义系统提示符的变量
\d:显示日期,格式为“星期 月 日”
\h:显示简写主机名。如默认主名“localhost”
\t:显示24小时制时间,格式为“HH:MM:SS”
\T:显示12小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”
举例:
u [root@localhost ~]# PS1='[\u@\t \w]\$ '
u [root@04:50:08 /usr/local/src]#PS1='[\u@\@ \h \# \W]\$‘
u [root@04:53 上午 localhost 31 src]#PS1='[\u@\h \W]\$ '
10.4.3 位置参数变量 (预定义变量的一种)
1、位置参数变量
例子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: $@" #使用$@也代表所有参数
例子3:$*与$@的区别
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The parameter$x is: $y"
x=$(( $x +1 ))
done
10.4.4 预定义变量
1、预定义变量
#!/bin/bash
# Author: shenchao (E-mail: shenchao@lampbrother.net)
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、接收键盘输入
[root@localhost ~]# read [选项] [变量名]
选项:
-p “提示信息”:在等待read输入时,输出提示信息
-t 秒数: read命令会一直等待用户输入,使用
此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会
执行
-s: 隐藏输入的数据,适用于机密信息的输入
#!/bin/bash
# Author: shenchao (E-mail: shenchao@lampbrother.net)
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 数值运算与运算符
1、declare声明变量类型
[root@localhost ~]# declare [+/-][选项] 变量名 选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
2、数值运算
方法1
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb
方法2:expr或let数值运算工具
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意“+”号左右两 侧必须有空格
方法3(推荐):“$((运算式))”或“$[运算式]”
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(( $aa+$bb ))
[root@localhost ~]# gg=$[ $aa+$bb ]
3、运算符(越大越高)
[root@localhost ~]# aa=$(( (11+3)*3/2 ))
#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级
[root@localhost ~]# bb=$(( 14%3 ))
#14不能被3整除,余数是2
[root@localhost ~]# cc=$(( 1 && 0 ))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则
与的结果是0
10.5.2 变量测试与内容替换
例子1:测试x=${y-新值}
[root@localhost ~]# unset y #删除变量y
[root@localhost ~]# x=${y-new} #进行测试
[root@localhost ~]# echo $x
new
#因为变量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 $x
old
10.6 环境变量配置文件
10.6.1 环境变量配置文件简介
1、source命令
[root@localhost ~]# source 配置文件 或
[root@localhost ~]# . 配置文件
说明:一般当我们修改了配置文件,需要重新登陆下,配置文件才会生效,source可跳过 ; . 空格 = source
2、环境变量配置文件简介
u环境变量配置文件中主要是定义对系统的 操作环境生效的系统默认环境变量,比如 PATH、HISTSIZE、PS1、HOSTNAME等 默认环境变量。 只要是/etc 对所有登陆的用户都生效
u/etc/profile
u/etc/profile.d/*.sh
u~/.bash_profile
u~/.bashrc
u/etc/bashrc
10.6.2 环境变量配置文件作用
/etc/profile的作用:
u USER变量:
u LOGNAME变量:
u MAIL变量:
u PATH变量:
u HOSTNAME变量:
u HISTSIZE变量:
u umask:
u 调用/etc/profile.d/*.sh文件
~/.bash_profile的作用
u调用了~/.bashrc文件。
u在PATH变量后面加入了“:$HOME/bin”
这个目录
~/.bashrc的作用
u定义默认别名
u调用/etc/bashrc
/etc/bashrc的作用
uPS1变量
uumask
uPATH变量
u调用/etc/profile.d/*.sh文件
10.6.3 其他配置文件和登录信息
1、注销时生效的环境变量配置文件
u~/.bash_logout
2、其他配置文件
u~/bash_history
3、Shell登录信息
u本地终端欢迎信息: /etc/issue
u远程终端欢迎信息: /etc/issue.net
Ø 转义符在/etc/issue.net文件中不能使用
Ø 是否显示此欢迎信息,由ssh的配置文件 /etc/ssh/sshd_config决定,加入“Banner/etc/issue.net”行才能显示(记得重启SSH服务)
u登陆后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息(登陆之后可看到)
分情破爱始乱弃,流落天涯思别离。
如花似玉负情意,影如白昼暗自迷。
随风浮沉千叶落,行色匆匆鬓已稀。