bash shell
Shell就是用户和操作系统沟通的桥梁:(用户----shell----kernel----硬件)
系统shell配置文件
/etc/shells
作用:配置系统支持的shell
备注:/sbin/nologin(此shell不允许登录系统)
修改用户登陆shell
管理员修改
修改/etc/passwd文件
普通用户修改
chsh命令,下次登陆生效
启动子shell
命令行登陆linux系统后,就工作shell环境中,如果要启动子shell,执行shell命令即可,如:
#bash 启动bash shell
#csh 启动c shell
查看shell层级
#echo $SHLVL
退出当前shell
#exit
bash 命令行参数
-c 从string中读取命令并处理它们(当前shell)
-r 启动限制性子shell,显示用户在当前目录下活动(启动子shell)
-i 启动交互式子shell,允许用户输入(启动子shell)
-s 从标准输入读取命令,启动子shell(启动子shell)
bash shell主提示符
bash shell主提示符通过PS1环境变量设置,/etc/bashrc文件中对PS1进行了设置
#echo $PS1
[\u@\h \W]\$
主提示符含义:
\d “日 月 年”格式显示的日期
\h 本地主机名
\H FQDN
\W 当前工作目录的基名
\w 当前工作目录
\u 当前登陆的用户名
\v bash shell的版本
\$ 普通用户登陆为$,root用户登陆为#
....
bash shell配置文件
全局配置
/etc/profile,/etc/profile.d/*.sh,/etc/bashrc
个人配置
~/.bash_profile,~/.bashrc
profile类的文件:
1、设定环境变量 echo $PATH
2、运行命令或脚本
bashrc类的文件:
1、设定本地变量
2、定义命令别名
登陆式shell
1.正常通过某终端登陆;
2.su - USERNAME 或su -l USERNAME
读取配置文件及顺序:
/etc/profile---->/etc/profile.d/*.sh---->~/.bash_profile---->~/.bashrc---->/etc/bashrc
非登陆式shell
1.交互式shell
su USERNAME
图形终端下打开命令窗口
系统自动执行的shell脚本
2.运行脚本
读取配置文件及顺序:
~/.bashrc--->/etc/bashrc--->/etc/profile.d/*sh
备注:
命令行执行脚本,会继承当前shell环境变量
系统启动脚本(非命令行执行),不能使用环境变量。(执行系统启动脚本时,还未启动shell)
系统启动时,默认显示进度条。使用alt+回车键转换未启动启动加载的详细信息。
退出登陆式shell
退出登陆式shell时,会执行~/.bash_logout文件
其他配置文件
1.登陆界面 /etc/issue
# cat /etc/issue
Red Hat Enterprise Linux Server release 6.5 (Santiago)
Kernel \r on an \m
issue内的各代码意义
\d 本地端时间的日期
\l 显示第几个终端机接口
\m 显示硬件的等级
\n 显示主机的网络名称
\r 操作系统的版本,等同于uname –r
\t 显示本地端时间的时间
\s 操作系统的名称
\v 操作系统的版本
2.欢迎界面 /etc/motd
登陆成功后显示的欢迎信息
3.语言环境 /etc/sysconfig/i18n
/etc/profile.d/lang.sh会调用此文件配置,用于设置LANG变量
Bash shell功能
1、命令历史、命令补全
2、管道、重定向
3、命令别名
4、命令行编辑
5、命令行展开
6、文件名通配
7、变量
8、编程
命令行编辑
ctrl+c 终止目前的命令
ctrl+d 删除光标当前的内容
ctrl+m 就是Enter
ctrl+s 暂停屏幕的输出,相当于锁定屏幕
ctrl+q 恢复屏幕的输出,相当于解锁屏幕
ctrl+z 暂停目前的命令
Ctrl+a:调到命令行首
Ctrl+e:调到命令行尾
ctrl+u 删除光标至命令行行首的内容
ctrl+k 删除光标至命令行尾的内容
Ctrl+l 清屏
命令历史
~/.bash_history文件:记录的是上次登录运行的命令
本次登录运行的命令暂存在临时内存中,本次注销时,才记录到~/.bash_history文件中,默认HISTSIZE=1000,本次注销时,会将最近执行的1000条写入~./bashrc_history文件中
history:
n 列出最近n条命令
-c:清空命令历史
-a filename将本次新增的history命令追加到filename,默认追加~/.bash_history
-w filename 保存命令历史到filename,未指定filename,默认写入~/.bash_history
-r filename 将filename的内容读到命令历史中
-d OFFSET [n]:删除指定位置的命令
eg:-d 100 10从第100个命令,往后删除10个
-w:保存命令历史至历史文件
!n:执行命令历史中的第n条命令
!-n:执行命令历史中的倒数第n条命令
!!:执行上一条命令
!string:执行命令历史中最近一个以指定字符串开头的命令
!$:引用前一个命令的最后一个参数
命令补全
搜索PATH环境变量所指定的每个路径下以我们给出的字符串开头的可执行文件,如果多于1个,则用2个tab键,给出列表,否则将直接补全(tab键)
路径补全
搜索我们给出的起始路径下的每个文件名,并试图补全。(tab键)
命令查找顺序
1.以相对或绝对路径执行命令,如:/bin/ls ./ls
2.alias
3.bash内置命令
4.按$PATH变量的顺序找到的第一个命令来执行(PATH变量的路径以冒号分割)
命令别名
alias 别名= '命令 [option] [argsment]'
撤销别名:unalias 别名
eg: alias cls=clear
作用范围:在shell中定义的别名仅在当前shell进程生命周期中有效
文件名通配
* 任意长度的任意字符
? 任意单个字符
[] 匹配括号内的任意一个字符
[:space:] 空白字符
[:punct:] 小写字母
[:punct:] 标点符号
[:lower:] 小写字母
[:upper:] 大写字母
[:alpha:] 所有字母
[:digit:] 数字
[:alnum:] 所有字母+数字
[^] 匹配括号 内范围外的任意单个字符
eg:
[abc]
[^abc]
[a-f]
[A-Da-d0-9]
[[:alpha:]]* 字母开头
练习:
显示所有文件名中包含数字的文件
ls *[[:digit:]]*
显示包含了非数字或字母的特殊符号的文件
ls *[[:alnum:]]*
管道|
将前一命令的输出作为后一命令的输入,管道符两侧的命令几乎同时运行,速度很快。
#rpm -qa | sort #对已安装的rpm包进行排序
管道符可以多次使用
#cut -d: -f1 /etc/passwd | sort -n | tr 'a-z' 'A-Z' #以冒号作为分隔符,裁剪passwd
文件的第1字段,并对其排序,然后将小写替换成大写
重定向
参见数据呈现
变量
设置用户当前shell的工作环境
环境变量
环境变量用来存储有关shell会话和工作环境的信息
环境量允许你在内存中存储数据,以便运行在shell上的程序和脚本访问
环境变量是存储永久数据的一种简便方法,这些数据可以是用来识别用户、账户、
系统、shell的特性以及任何其他你需要存储的数据。
作用域:当前shell进程及其子shell进程
查看环境变量:printenv、env、export
常见bash shell 环境变量
HOME 当前用户主目录
IFS 分割符
PATH shell查找命令的目录列表
PS1 主提示符
PS2 次提示符
OPTARG getopts命令处理的最后一个选项参数值
OPTIND getopts命令处理的最后一个参数值的索引
HISTSIZE 历史命令
LANG shell的语言环境
PWD 当前工作目录
OLDPWD 上次工作目录
RANDOM 返回0-32767的随机值
SHELL shell的全路径名
REPLY read命令的默认变量
UID 当前用户UID
TMPDIR 创建临时文件的目录名
SECONDS 当前shell启动的秒数
TMOUT read和select命令
SHLVL shell层级,每启动一个新的shell时,值加1
USER 当前登陆的用户名
Tips:任何路径均可执行脚本的命令
PATH=$PATH:.
局部变量
局部变量在脚本或命令中定义
作用域:当前shell实例中有效。
查看局部变量:无单独查看命令,可使用set命令减去printenv
声明变量类型 declare
declare [-aixr] variable
参数:
-a:声明变量为数组类型
-i:声明变量为整型
-x:声明变量为环境变量,用法与export一样
-r:设置变量为readonly类型,此变量不可修改,相当于常量。
-p:列出变量的类型
+x:取消声明为环境变量
变量设置
variable=value
变量与变量值之间以“=”来连接,中间无空格
变量名只能包含字母、数字和下划线,且不能以数字开头;
不应该跟系统中已有的环境变量重名;
最好做到见名知义
变量替换
variable=$variable1 #将变量variable1的值赋给变量variable
命令替换
将命令执行结果赋给变量,命令替换通过反引号或$()实现
variable=`uname -r`
variable=$( uname -r) #只会将命令的标准输出赋给变量
输出变量值
echo $variable
区分出变量名
双引号或{}实现
name=Hello nameWorld=hh #echo $nameWorld hh #echo $"name"World HelloWorld #echo ${name}World HelloWorld
删除变量 unset
unset variable
设置变量为环境变量 export或declare -x
name=szb;export name #等同于export name=szb
name=szb;declare -x name
备注:临时生效,要想永久生效,需写入相关配置文件,如/etc/profile
变量内容的删除
支持通配
${变量名#关键字} 若变量内容从开头位置开始的数据符合“关键字”,则将符合的最短数据删除(非贪婪模式)
${变量名##关键字} 若变量内容从开头位置开始的数据符合“关键字”,则将符合的最长数据删除(贪婪模式)
${变量名%关键字} 若变量内容从尾部位置开始的数据符合“关键字”,则将符合的最短数据删除(非贪婪模式)
${变量名%%关键字} 若变量内容从尾部位置开始的数据符合“关键字”,则将符合的最长数据删除(贪婪模式)
示例:
file=/dir1/dir2/dir3/my.file.txt
${file#*/} ---> dir1/dir2/dir3/my.file.txt
${file##*/} ----> my.file.txt
${file%/*} ----> dir1/dir2/dir3
${file%%/*} ----> 空
总结:#从左开始,%从右开始,两个符号贪婪模式。
变量内容的替换
支持通配
${变量名/旧字符串/新字符串} 从左往右,将第一个符合旧字符串替换为新字符串
${变量名//旧字符串/新字符串} 将所有旧字符串替换为新字符串
示例:
file=/dir1/dir2/dir3/my.file.txt
${file/dir/path} ----> /path1/dir2/dir3/my.file.txt
${file//dir/path} ----> /path1/path2/path3/my.file.txt
变量字符串切片
${var:offset} #偏移offset,取剩下的子串
${var:offset:length} #偏移offset,取length长度的子串
A='hello world'
echo ${A:2}
llo world
echo ${A:2:3}
llo
取变量内容的长度 ${#变量名}
A='hello world'
echo ${#A}
11
变量的测试与替换
判断变量是否存在,如果存在则使用既有变量,如果不存在则给予一个常用的设置
${file-my.file.txt} :假如 $file 没有设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理)
${file:-my.file.txt} :假如 $file 没有设定或为空值,则使用 my.file.txt 作传回值。 (非空值时不作处理)
${file+my.file.txt} :假如 $file 设为空值或非空值,均使用 my.file.txt 作传回值。(没设定时不作处理)
${file:+my.file.txt} :若 $file 为非空值,则使用 my.file.txt 作传回值。 (没设定及空值时不作处理)
${file=my.file.txt} :若 $file 没设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。 (空值及非空值时不作处理)
${file:=my.file.txt} :若 $file 没设定或为空值,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。 (非空值时不作处理)
${file?my.file.txt} :若 $file 没设定,则将 my.file.txt 输出至 STDERR。 (空值及非空值时不作处理)
${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值时不作处理)
SHELL编程
参见shell编程章节