一、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、kshBash、psh、zsh;C家族主要包括:csh、tcsh
Bash:Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。
3.Linux支持的Shell
/etc/shells
二、Shell脚本的执行方式
1.echo输出命令
echo [选项] [输出内容]
选项:
-e: 支持反斜线控制的字符转换
示例:
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.第一个脚本
vi hello.sh
#!/bin/bash(不是注释,标注以下写的是shell脚本)
#The first program
#Author: shencho (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
4.将windows转换成linux
dos2unix 文件名
若未安装:
yum -y install dos2unix
三、Bash的基本功能
①. 历史命令与命令补全
1.历史命令
history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令
-w:把缓存中的历史命令写入历史命令保存文件 ~/.bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
历史命令的调用:
使用上、下箭头调用以前的历史命令
使用“!n”重复执行第n条历史命令
使用“!!”重复执行上一条命令
使用“!字串”重复执行最后一条以该字串开头的命令
2.命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全
②.命名别名与常用快捷键
1.命令别名
alias 别名='原命令'
#设定命令别名
alias
#查询命令别名
命令执行时顺序:
1 第一顺位执行用绝对路径或相对路径执行的命令。
2 第二顺位执行别名。
3 第三顺位执行Bash的内部命令。
4 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
让别名永久生效
vi /root/.bashrc
删除别名
unalias 别名
2.Bash常用快捷键
③. 输入输出重定向
1.标准输入输出
2.输出重定向
3.输入重定向
wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
命令 < 文件 把文件作为命令的输入
④. 多命令顺序执行与管道符
1.多命令顺序执行
示例:
ls;date;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
#判断命令是否正确
2.管道符
命令格式:
命令1 | 命令2
#命令1 的正确输出作为命令2 的操作对象
颜色显示
示例:
ll -a /etc/ | more
netstat -an | grep "ESTABLISHED"
grep [选项] “搜索内容” 文件名
选项:
-i : 忽略大小写
-n: 输出行号
-v: 反向查找
--color=auto 搜索出的关键字用颜色显示
⑤. 通配符和其他特殊符号
1.通配符
2.Bash中其他特殊符号
示例:
单引号与双引号
name=sc
echo ‘$name’
echo '$name'
echo '$(date)'
echo '$(date)'
反引号与$( )
echo `ls`
echo $(date)
四、Bash的变量
①. 用户自定义变量
1.什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息是,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
2.变量设置规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
在Bash中,变量的默认类型都是字符串型,如果要进行述职运算,则必须指定变量,类型为数值型。
变量用等号连接值,等号左右两侧不能有空格。
变量的值如果有空格,需要使用单引号或双引号包括。
在变量的值中,可以使用“\”转义符。
如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或¥()包含命令。
环境变量名建议大写,便于区分。
3.变量分类
用户自定义变量。
环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
4.本地变量
变量定义
name="shen chao"
变量叠加
aa=123
aa="$aa"456
aa=${aa}789
变量调用
echo $name
变量查看
set
变量删除
unset name
②. 环境变量
1.环境变量是什么
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
2.设置环境变量
export 变量名=变量值
#声明变量
env
#查询变量
unset 变量名
#删除变量
pstree
#确定进程数
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:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”
示例:
[root@localhost ~]# PS1='[\u@\t \w]\$ '
[root@04:50:08 /usr/local/src]#PS1='[\u@\@ \h \# \W]\$'
[root@04:53 上午 localhost 31 src]# PS1='[\u@\h \W]\$ '
③. 位置参数变量
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 parameters is:$y"
done
④. 预定义变量
1.预定义变量
示例:
#!/bin/bash
#Author:cheng
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.接收键盘输入
read [选项] [变量名]
选项:
-p“提示信息”:在等待read输入时,输出提示信息
-t 秒数 : read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会执行
-s: 隐藏输入的数据,适用于机密信息的输入
示例:
#!/bin/bash
#Author:shenchao
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"
五、Bash变量
①. 数值运算与运算符
1.declare声明变量类型
declare [+/-][选项] 变量名
选项:
- : 给变量设定类型属性
+ : 取消变量的类型属性
-i : 将变量声明为整数型(integer)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
2.数值运算——方法1
aa=11
bb=22
#给变量aa和bb赋值
declare -i cc=$aa+$bb
方法2:expr或let数值运算工具
aa=11
bb=22
#给变量aa和变量bb赋值
#dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意“+”号左右两侧必须有空格
方法3:“$((运算式))”或“$[运算式]” (常用)
aa=11
bb=22
ff=$(($aa+$bb))
gg=$[$aa+$bb]
3.运算符
示例:
aa=$(( (11+3)*3/2))
#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级
bb=$(( 14%3 ))
#14不能被3整除,余数是2
cc=$(( 1&& 0 ))
#逻辑与运算只有相与的两边都是1,与的结果才是1,否则与的结果是0
②. 变量测试与内容替换
例子1:测试x=${y-新值}
unset y
#删除变量y
x=${y-new}
#进行测试
echo $x
new
#因为变量y不存在,所以x=new
y=""
x=${y-new}
#进行测试
echo $x
六、环境变量配置文件
①. 环境变量配置文件简介
1.source命令
source 配置文件
#或
. 配置文件
2.环境变量配置文件简介
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
②. 环境变量配置文件作用
/etc/profile的作用:
USER变量:
LOGNAME变量:
MAIL变量:
PATH变量:
HOSTNAME变量:
HISTSIZE变量:
umask:
调用/etc/profile.d/*.sh文件
~/.bash_profile的作用:
调用了~/.bashrc文件。
在PATH变量后面加入了“:$HOME/bin”这个目录
~/.bashrc的作用:
定义默认别名
调用/etc/bashrc
/etc/bashrc的作用: (no login shell)
PS1变量
umask
PATH变量
调用/etc/profile.d/*.sh文件
③. 其他配置文件和登录信息
1.注销时生效的环境变量配置文件
~/.bash_logout
2.其他配置文件
~/.bash_history
3.Shell登录信息
本地终端欢迎信息:/etc/issue
远程终端欢迎信息: /etc/issue.net
转义符在/etc/issue.net文件中不能使用
是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务)
登陆后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息