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编程章节

posted @ 2017-06-24 21:33  思念我的娃  阅读(161)  评论(0编辑  收藏  举报