一、Shell基本知识
Shell是一个命令行解释器,它为用户提供了一个面向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序;
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强,Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令
- echo [选项] [输出内容] # 输出命令 # -e 支持反斜线控制的字符转换
- 第一个脚本 #vi hello.sh
#!/bin/bash
# The first program
echo -e "\e[1; 34m hello world. \e[0m" #打印带颜色的内容
执行脚本
a. 赋予执行权限,直接运行chmod 755 hello.sh ./hello.sh
b. 通过Bash调用执行脚本
bash hello.sh
二、Bash的基本功能
- 命令别名与快捷键
- 临时添加或删除别名
i. alias #查看系统中所有所有的命令别名
ii. alias 别名=‘原命令’ #设定命令别名
iii. unalias 别名 #删除别名 - 别名永久生效
i. vi ~/.bashrc #写入环境变量配置文件,重启后生效
ii. source .bashrc #重新加载配置文件后,立即生效 - 常用快捷键
i. ctrl+c 强制终止当前命令
ii. ctrl+l 清屏 (等同于clear)
iii. ctrl+a 光标移动到命令行首
iv. ctrl+e 光标移动到命令行尾
v. ctrl+u 从光标所在位置删除到行首
vi. ctrl+z 把命令放入后台
vii. ctrl+r 在历史命令中搜索
- 临时添加或删除别名
- 历史命令:history [选项] [历史命令保存文件]
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history
历史命令的调用:
● 使用上、下箭头调用以前的历史命令
● 使用“!n”重复执行第n条历史命令
● 使用”!!”重复执行上一条命令
● 使用”!字串”重复执行最后一条以该字串开头的命令 输出重定向
- 标准输出重定向:
i. 命令 > 文件 #以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
ii. 命令 >> 文件 #以追加的方式,把命令的正确输出输出到指定的文件或设备当中 - 标准错误输出重定向:
i. 错误命令 2>文件 #以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
ii. 错误命令 2 >>文件 #以追加的方式,把命令的错误输出输出到指定的文件或设备当中 - 正确输出和错误输出同时保存
i. 命令 > 文件 2 >&1 #以覆盖的方式,把正确输出和错误输出都保存在同一个文件当中
ii. 命令 >> 文件 2 >&1 #以追加的方式,把正确输出和错误输出都保存在同一个文件当中
iii. 命令 &>文件 #以覆盖的方式,把正确输出和错误输出都保存在同一个文件当中
iv. 命令 &>>文件 #以追加的方式,把正确输出和错误输出都保存在同一个文件当中
v. 命令 >>文件1 2 >>文件2 #以追加的方式,把正确输出追加到文件1中,把错误的输出追加到文件2中
- 标准输出重定向:
输入重定向:wc [选项] [文件名]
-c 统计字节数
-w 统计单词数
-l 统计行数
wc 直接输入内容,ctrl+d退出- 多命令执行
a. ; 命令1;命令2 #多命令顺序执行,命令之间没有任何逻辑联系
b. && 命令1&&命令2 #逻辑与,只有当命令1正确执行,命令2才会执行
c. || 命令1||命令2 #逻辑或,只有当命令1执行不正确,命令2才会执行
d. 管道符: 命令1 | 命令2 #命令1的正确输出作为命令2的操作对象,例:
i. ls -lh /etc | more 分屏显示ls查询的结果
ii. netstat -an | grep ESTABLISHED | wc -l #查询有多少个网络与服务器建立了连接 - 通配符
a. ? 匹配一个任意字符
b. * 匹配0个或任意多个任意字符,也就是可以匹配任何内容
c. [] 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c。
d. [-] 匹配括号中任意一个字符,-代表一个范围。例如:[a-z]代表匹配一个小写字母
e. [^] 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符 - 其它特殊符号
a. ‘ 单引号。在单引号中所有的特殊符号,如“$” 和”`”(反引号)都没有特殊含义
b. “” 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、”`”、和”\”是例外,拥有”调用变量的值“、”引用命令“和”转义符“的特殊含义。
c. “ 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错
d. $() 和反引号的作用一样,用来引用系统命令
e. # 在Shell脚本中,#开头的行代表注释
f. $ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
g. \ 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出”$“符号,而不是当作是变量引用。
三、Shell编程
(一)变量
变量的分类:
- 用户自定义变量。变量是自定义的;局部变量,只能在当前的shell中生效
环境变量:这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作是固定的
- 环境变量是全局变量,在当前shell和这个shell的所有子shell中生效 (pstree 查看shell树)
- 自定义的环境变量:export 变量名=变量值
或:变量名=变量值 export 变量值 常用环境变量(一般定义为大写)
HOSTNAME:主机名
SHELL:当前shell
TERM:终端环境
HISTSIZE:历史命令条数
SSH_CLIENT:当前操作环境是用ssh连接的,这里记录客户端ip
SSH_TTY:ssh连接的终端时pts/1
USER:当前登录的用户
PATH:系统查找命令的路径
PS1:命令提示符设置- \d:显示日期,格式为“星期 月 日”
- \H:显示完整的主机名。如默认主机名“localhost.localdomain”
- \t:显示24小时制时间,格式为“HH:MM:SS”
- \A:显示24小时制时间,格式为“HH:MM”
- \u:显示当前用户
- \w:显示当所在目录的完整名称
- \W:显示当前所在目录的最后一个目录
- $:提示符。如果是root用户会显示提示符为”#“,如果是普通用户会显示提示符为“$”
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
$n:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含${10}
$*:这个变量代表命令行中所有的参数,$*把所有参数看成一个整体
$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#:这个变量代表命令行中所有参数的个数- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用是固定的
$?:最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行; 如果这个变量值为非0(具体是哪个数,由命令自已来次定),则证明上一个命令执行不正确了。
$$:当前进程的进程号(PID)
$!:后台运行的最后一个进程的进程号(PID)
变量基础知识
- shell中变量默认所有变量都是字符串类型,是弱类型
- 变量名赋值:变量名=变量值 #等号两边不能有空格
- 变量叠加:x=123,x=”$x”456,结果:x=123456
- set [选项] -u 如果设定此选项,调用未声明变量时会报错 #变量查看命令
- unset 变量名 # 删除变量
- env # 用来查看环境变量
locale #查询当前系统语系
LANG:定义系统主语系的变理 LC_ALL:定义整体语系的变理 locale -a | more # 查看系统支持的所有语系 查询系统默认语系:cat /etc/sysconfig/i18n #下次开机后的系统环境
read [选项] [变量名] #接收键盘输入
-p "提示信息" #在等待read输入时,输出提示信息 -t 秒数 #read命令会一直等待用户输入,使用此选项可以指定等待时间 -n 字符数 #read命令只接受指定的字符数,就会执行 -s #隐藏输入的数据,适用于机密信息的输入
(二)运算符
declare [+/-] [选项] 变量名 #声明变量类型
- #给变量设定类型属性 + #取消变量的类型属性 -a #将变量声明为数组型; 注:查看数组需要加大括号,如:echo ${movie}、echo ${movie[2]} 、echo ${movie[*]} -i #将变量声明为整数型 -x #将变量声明为环境变量 -r #将变量声明为只读变量,要慎重,加了只读属性后,难以改变、删除 -p #显示指定变量的被声明的类型,后面不加变量名,查询所有变量的属性
数值运算的方法
expr或let数值运算工具,如:
# aa=11 # bb=22 # cc=$(expr $aa + $bb) #"+"号左右两侧必须有空格
$((运算式))或$[运算式] # $(命令),单小括号,执行命令
- 常用运算符及优先级
变量测试
(三)环境变量配置文件
环境变量配置文件
- source 配置文件 或 . 配置文件 #配置文件修改后,必须注销重新登录才能生效,使用source命令可以不用重新登录
环境变量配置文件中主要是定义对系统操作环境生效的系统默认环境变量,常用的环境变量配置文件:(主要对登录起作用)
/etc/profile /etc/profile.d/*.sh ~/.bash_profile # 调用下一个环境变量文件 ~/.bashrc # 别名,调用下一个环境变量文件 /etc/bashrc # 定义PS1,non login 加载环境变量
环境变量配置文件的功能
- 正常登录配置文件完整加载路径:
- 切换用户配置文件简化加载路径:
/etc/profile的作用:
USER变量 LOGNAME变量 MAIL PATH HOSTNAME HISTSIZE umask #查看系统默认权限 - 文件最高权限为666 - 目录最高权限为777 - 权限不使用数字进行换算,而必须使用字母 - umask定义的权限,是系统默认权限中准备丢弃的权限,如:umask="022" 创建文件的默认权限:rw-rw-rw- ----w--w- = rw-r--r-- 调用/etc/profile.d/*.sh文件:
- 正常登录配置文件完整加载路径:
其它配置文件
- ~/.bash_logout # 注销时生效的环境变量配置文件。默认为空文件,可以根据需要添加,如退出清空历史命令
- ~/.bash_logout # 保存历史命令。退出登录时,才会将当前命令保存到文件中
- shell登录信息
- 本地终端欢迎信息:/etc/issue
- 远程终端欢迎信息:/etc/issue.net
- 转义符在/etc/issue.net文件中不能使用
- 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入”Banner/etc/issue.net”行才能显示(记得重启SSH服务) - 登录后欢迎信息:/etc/motd
- 不管是本地登录,还是远程登录,都可以显示欢迎信息
- 本地终端欢迎信息:/etc/issue
(四)正则表达式
通配符:用来匹配符合条件的文件名,是完全匹配,ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符进行匹配。
* #匹配任意内容 ? #匹配任意一个内容 [] #匹配中括号中的一个字符
- 正则表达式:用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式,基础正则表达式:
(五)字符截取&处理命令
- cut字段提取命令
cut [选项] 文件名 # 按列提取字符串,默认分隔符为制表符
- -f 列号 #提取第几列
- -d 分隔符 #按照指定分隔符分隔列,以空格为分隔符容易出问题
printf命令 #格式化输出命令
- printf ‘输出类型输出格式’ 输出内容
输出类型:
%ns:输出字符串。n是数字,指代输出几个字符 %ni:输出整数。n是数字,指代输出几个字符 %m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数,如%8.2f代表共输出8位数,其中2位是小数,6位是整数
输出格式:
\a:输出警告声音 \b:输出退格键,也就是Backspace键 \f:清除屏幕 \n:换行 \r:回车,也就是Enter键 \t:水平输出退格键,也就是Tab键 \v:垂直输出退格键,也就是Tab键
- print #会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
awk命令
- awk ‘条件1{动作1}条件2{动作2}…’ 文件名 #从文件中截取数据,默认用空格或制表符作为分隔符
条件(pattern):一般使用关系表达式作为条件
x>10 判断x是否大于10 x>=10 大于等于 x<=10 小于等于
动作(Action)
- 格式化输出
- 流程控制语句
BEGINE\END #作为条件,在执行所有动作之前/后执行的动作,如:
cat /etc/passwd |grep /bin/bash | awk 'BEGIN{FS=":"}$1=="ltf"{printf $1"\t"$3"\n"}' # 在/etc/passwd文件中,找出用户名为ltf的所在行第1、第3列信息。
sed命令 #主要是用来将数据进行选取、替换、删除、新增的命令
- 格式:sed [选项] ‘[动作]’ 文件名 #多个动作用“;”隔开,需要改变指定行直接在动作前加行号
选项:
-n #一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕 -e #允许对输入数据应用多条sed命令编辑 -i #用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a #追加,在当前行后添加一行或多行 c #行替换,用c后面的字符串替换原数据行 d #行删除,删除指定的行 i #插入,在当期行前插入一行或多行。d:删除,删除指定的行 p #打印,输出指定的行 s #字串替换,用一个字符串替换另外一个字符串。格式为"行范围s/旧字串/新字串/g(和vim中的替换格式类似)。
实例:
sed -n '2p' abc #打印abc文件的第2行 sed '2s/ltf/litaifa/g' abc #将abc文件中第2行中字符串”ltf“替换成"litaifa" sed 's/ltf/litaifa/g' abc #将abc文件中字符串”ltf“替换成"litaifa"
sort命令 #排序
sort [选项] 文件名-f #忽略大小写 -n #以数值型进行排序,默认使用字符串型排序 -r #反向排序 -t #指定分隔符,默认分隔符是制表符 -k n[,m] #按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)
wc命令 #统计命令
wc [选项] 文件名-l #只统计行数 -w #只统计单词数 -m #只统计字符数
(六)条件判断与流程控制
条件判断式
- 按照文件类型进行判断
- 按照文件权限进行判断
- 两个文件之间进行比较
- 两个整数之间比较
- 字符串的判断
多重条件判断
两种判断格式,如:
test -e /root/install.log [-e /root/install.log] #常用这种格式
- 按照文件类型进行判断
单分支if语句
if [条件判断式];then 程序 fi 或者 if [条件判断式] then 程序 fi
双分支if语句
if [条件判断式] then 条件成立时,执行的程序 else 条件不成立时,执行的另一个程序 fi
多分支if语句
if [条件判断式1] then 条件1成立时,执行程序1 elif [条件判断式2] then 条件2成立时,执行程序2 ...... else 当所有条件都不成立时,最后执行此程序 fi
case语句
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; ...... *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
for循环
for 变量 in 值1 值2 值3 ... do 程序 done
while循环和until循环
while [条件判断式] #符合条件循环 do 程序 done until [条件判断式] #符合条件终止循环 do 程序 done