设为首页 收藏本站
查看: 795|回复: 0

Linux之bash shell特性

[复制链接]

尚未签到

发表于 2018-8-21 13:11:46 | 显示全部楼层 |阅读模式
一、shell是什么?
  Shell 本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
  如图shell是一个应用程序,是用户管理应用程序的一个接口。 DSC0000.png
二、广义上shell的分类
  GUI:图形用户界面
  KDE,GNOME,XFCE
  CLI:命令行接口
  bash, zsh, fishsh, csh, tcsh, ksh
  在大多发行版中常用的为bash
三、bash的特性
  bash是弱类型的编程语言,不严格区分数据类型,意味把所有数据统统当作字符串处理;
  字符串类型的数据可不加引号;
  引号有三种类型:', ", `
  ', ":字符引用
  ': 强引用,其内部的变量不会被替换;
  ":弱引用,其内部的变量会被替换;
  `:命令引用
  变量引用:${NAME}
  a、bash特性之一:快捷键
ctrl + ? 撤消前一次输入  
ctrl + c 另起一行
  
ctrl + r 输入单词搜索历史命令
  

  
删除
  
ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dl
  
ctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dh
  
ctrl + k 删除光标后面所有字符相当于VIM里d shift+$
  
ctrl + u 删除光标前面所有字符相当于VIM里d shift+^
  
ctrl + w 删除光标前一个单词相当于VIM里db
  
ctrl + y 恢复ctrl+u上次执行时删除的字符
  
ctrl + ? 撤消前一次输入
  
alt + r 撤消前一次动作
  
alt + d 删除光标所在位置的后单词
  

  
移动
  
ctrl + a 将光标移动到命令行开头相当于VIM里shift+^
  
ctrl + e 将光标移动到命令行结尾处相当于VIM里shift+$
  
ctrl + f 光标向后移动一个字符相当于VIM里l
  
ctrl + b 光标向前移动一个字符相当于VIM里h
  
ctrl + 方向键左键 光标移动到前一个单词开头
  
ctrl + 方向键右键 光标移动到后一个单词结尾
  
ctrl + x 在上次光标所在字符和当前光标所在字符之间跳转
  
alt + f 跳到光标所在位置单词尾部
  

  
替换
  
ctrl + t 将光标当前字符与前面一个字符替换
  
alt + t 交换两个光标当前所处位置单词和光标前一个单词
  
alt + u 把光标当前位置单词变为大写
  
alt + l 把光标当前位置单词变为小写
  
alt + c 把光标当前位置单词头一个字母变为大写
  
^oldstr^newstr 替换前一次命令中字符串
  

  
历史命令编辑
  
ctrl + p 返回上一次输入命令字符
  
ctrl + r 输入单词搜索历史命令
  
alt + p 输入字符查找与字符相接近的历史命令
  
alt + > 返回上一次执行命令
  

  
其它
  
ctrl + s 锁住终端
  
ctrl + q 解锁终端
  
ctrl + l 清屏相当于命令clear
  
ctrl + c 中止当前命令
  
ctrl + d 后台执行(等同于命令后面接&)
  
ctrl + i 类似TAB健补全功能
  
ctrl + o 重复执行命令
  
alt + 数字键 操作的次数
  
Esc-b 左移一个单词
  
Esc-f 右移一个单词
  
ctrl+s : 锁住屏幕
  
ctrl+q : 恢复屏幕
  b、bash的特性之二:命令历史
  shell进程会保存其会话中用户曾经执行过的命令;命令通过其“历史文件”来持久保存此前执行过的命令;每个用户都有其自己专用的历史文件;
  HISTSIZE:shell进程的缓冲区保留的历史命令的条数;
  HISTFILESIZE:命令历史文件可保存的历史命令的条数;
  HOSTTIMEFORMAT:历史命令加时间戳,用于审计;
  HISTIGNORE="str1:str2:…"忽略string1,string2历史;
#export HISTTIMEFORMAT="%F %T"  
...
  
  358  2016-12-28 04:12:34 man split
  
  359  2016-12-28 04:14:29 cd
  
  360  2016-12-28 04:14:34 vim .bash_history
  
  361  2016-12-28 04:22:39 history
  默认均为1000;
# echo $HISTSIZE  
1000
  
# echo $HISTFILESIZE
  
1000
  HISTFILE:当前用户的命令历史文件;
  ~/.bash_history
  查看命令历史列表:
# history  命令用法:
  history -c:清空命令历史;
  history -d OFFSET:删除指定的条目;
# history -d 156  -a:将当前缓冲的历史行追加到历史文件中
  -n:从历史文件中读取所有未被读取的行
  -r:读取历史文件并将内容追加到历史列表中
  -w:保存历史列表到指定的历史文件
  -s: 展开历史参数成一行,附加在历史列表后(伪造历史命令)
  调用命令历史列表中的命令以重执行之目的:
  !#:再一次执行历史列表中的第#条命令;
# history  
   ....
  
   72  cat test
  
   73  history
  
# !72
  
cat test
  
Hello World
  !!:再一次执行上一条命令;
# cat test  
Hello World
  
# !!
  
cat test
  
Hello World
  !STRING:再一次执行命令历史列表中最近一个以指定的STRING开头的命令;
# !cat  
cat test
  
Hello World
  显示最近的n条件命令历史:
history  #  控制命令历史的记录方式:
  通过HISTCONTROL环境变量进行,其取值:
  ignoredups:忽略重复的命令;重复是指连续且相同的令;
  ignorespace:以空白字符开头的命令不记入历史;
  ignoreboth:上述两者同时生效;
  erasedups:删除重复命令;
  修改变量值的方式:
NAME='VALUE'  

  
# echo $HISTCONTROL
  
ignoredups
  
# HISTCONTROL="ignoreboth"
  
# echo $HISTCONTROL
  
ignoreboth
  永久生效存放位置:
  存放在 /etc/profile 或 ~/.bash_profile或/etc/profile.d/*.sh
  历史命令参数调用:
调用上一条命令的最后一个参数:  

  
快捷键:ESC, .
  

  
Alt+.
  

  
!$:给出的字符组合
  

  
\#cmd !^ : 利用上一个命令的第一个参数做cmd的参数
  

  
\#cmd !$ : 利用上一个命令的最后一个参数做cmd的参数
  

  
\#cmd !* : 利用上一个命令的全部参数做cmd的参数
  

  
\#cmd !:n : 利用上一个命令的第n个参数做cmd的参数
  

  
!n:^ 调用第n条命令的第一个参数
  

  
!n:$ 调用第n条命令的最后一个参数
  

  
!m:n 调用第m条命令的第n个参数
  

  
!n:* 调用第n条命令的所有参数
  

  
!string:^ 从命令历史中搜索以 string 开头的命令,并获取
  
它的第一个参数
  

  
!string:$ 从命令历史中搜索以 string 开头的命令,并获取它
  
的最后一个参数
  

  
!string:n 从命令历史中搜索以 string 开头的命令,并获取
  
它的第n个参数
  

  
!string:* 从命令历史中搜索以 string 开头的命令,并获取
  
它的所有参数
  c、bash的特性之三:内外部命令和命令路径补全
  命令补全:
  shell程序在接收到用户执行命令的请求且分析完成之后,最左侧字符串将被当作命令去查找;
  查找机制:
  (1) 查找内部命令;
  (2) 查找缓存在内存中的外部命令;
  (3) 查找外部命令:
  1、去$PATH变量所指定的各路径下,自左而右逐个搜索各目录下的文件名;
  2、给定的打头的字符串如果能惟一标识某命令程序文件的文件名,则直接补全;
  3、不能惟一标识,再击tab可给列表;
  4、错误:没有任何命令可被此打头字符串标识;
  type命令用来查看内部外部命令
  enable命令:
#enable -n cd 禁用内部命令  
#enable cd 激活内部命令
  使用which或者where查看命令所在的路径
  hash命令:
  搜寻到的外部命令路径结果缓存至kv(key-value)存储中
  hash 显示hash缓存 hash –r 清除缓存,hash -d COMMAND 清空制定的命令
#which --skip-alias cd  
/usr/bin/cd
  路径补全:
  在给定的起始路径的上级目录下,以对应路径下的打头字符串来逐一匹配上级目标下的每个文件:
  惟一标识:tab补全;
  不能惟一标识:tab, tab给出列表;
  错误路径:没有响应;
  d.bash特性之四命令提示符:
  命令提示符: prompt
  显示提示符格式:
[root@localhost ~]: echo $PS1  管理员: #
  普通用户: $
  下面简单说说环境下默认的特殊符号所代表的意义:
\d :代表日期,格式为weekday month date,例如:"Mon Aug1"  

  
    \H:完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
  

  
    \h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
  

  
    \t :显示时间为24小时格式,如:HH:MM:SS
  

  
    \T :显示时间为12小时格式
  

  
    \A :显示时间为24小时格式:HH:MM
  

  
    \u :当前用户的账号名称
  

  
    \v :BASH的版本信息
  

  
    \w :完整的工作目录名称。家目录会以 ~代替
  

  
    \W :利用basename取得工作目录名称,所以只会列出最后一个目录
  

  
    \# :下达的第几个命令
  

  
    \$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$
  例子:
export PS1='[\e[31;1m\u\e[36;1m@\e[33;1m\h\w\e[37;1m]\e[33;1m\$\e[0m'  e.bash特性之五终端:
  终端terminal
  服务器非必要部件
  用户与主机交互,必然用到的设备
  物理终端:直接接入本机的显示器和键盘设备
/dev/console  虚拟终端:附加在物理终端之上的以软件方式虚拟实现的
  终端,设备文件路径: /dev/tty#,CentOS 6默认启动6个虚拟终端 Ctrl+Alt+F#: [1,6]
  图形终端:属于虚拟终端,附加在物理终端之上的
  以软件方式虚拟实现的终端,但额外会提供桌面环境;
  模拟终端:图形界面打开的命令行以及基于ssh协议或 telnet协议等远程打开的界面,设备文件:/dev/pts/# [0, ∞)
  查看当前的终端设备: tty
  切换终端命令:chvt #
  f、bash的特性之五:命令行展开:
  把命令行的给定的特殊符号自动替换为相应字符串的机制;
  ~: 自动替换为用户家目录;
  ~USERNAME:自动替换为指定用户的家目录;
  {}:可承载一个以逗号分隔的路径列表,能够将其展开为多个独立路径;
  例如:
/tmp/{a,b,c} /tmp/a /tmp/b /tmp/c  

  
/tmp/{a,b}/z /tmp/a/z /tmp/b/z
  

  
# cd ~
  
# pwd
  
/root
  
# cd ~testuser
  
testuser]# pwd
  
/home/testuser
  g、bash的特性之七:glob
  glob:文件名通配;快速引用多个文件;文件名整体匹配度检测;
  元字符:基于元字符可编写匹配模式(pattern);
  *:匹配任意长度的任意字符;
  p, pa, *p, pa
  p*:pa, p
  ?:匹配任意单个字符;
  p?, p?a, p??
  p??: pa, pad,
  [ ]:匹配指定集合内的任意单个字符;
  [a-z], [A-Z]:不区分字符大小写;
  [a-z0-9]
  [[:upper:]]:所有大写字母;
  [[:lower:]]:所有小写字母;
  [[:digit:]]:所有的数字;
  [[:alpha:]]:所有字母;
  [[:alnum:]]:所有字母和数字;
  [[:space:]]:空白字符;
  [[:punct:]]:标点符号;
  [^ ]:匹配指定集合外的任意单个字符;
  [^[:alpha:]]
  测试:
  1、显示/etc目录下,以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录;
ls  -d  /etc/[^[:alpha:]][a-z]*  2、复制/etc目录下,所以n开头,以非数字结尾的文件或目录至/tmp/etc目录下;
mkdir /tmp/etc  
cp  -r  /etc/n*[^0-9]  /tmp/etc/
  3、显示/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录;
ls  -d  /ur/share/man/man[0-9]  4、复制/etc目录下,所以p,m,r开头的,且以.conf结尾的文件或目录至/tmp/conf.d目录下;
mkdir  /tmp/conf.d/  
cp  -r  /etc/[pmr]*.conf   /tmp/conf.d/
  h、bash基于特性之九:I/O重定向和管道
  程序的数据流有三个:
  输入数据流: ,标准输出(stdout), 显示器;
  错误数据流:–>,错误输出(stderr),显示器;
  fd:file descriptor,文件描述符;
  stdin: 0
  stdout: 1
  stderr: 2
  IO重定向:
  输出重定向:
  重定向程序正常执行的结果
  COMMAND > /PATH/TO/SOMEFILE
  覆盖重定向:覆盖目标文件中的原有内容;
  COMMAND >> /PATH/TO/SOMEFILE
  追加重定向:追加新产生的内容至目标文件尾部;
  shell的一个功能开关:
# set -C  禁止覆盖输出重定向至已存在的文件;
  注意:此时仍然可以使用“>|”至目标文件;
# set +C  关闭上述特性;
  错误重定向:
  重定向错误的执行结果;
  COMMAND 2> /PATH/TO/SOMEFILE
  错误输出覆盖重定向;
  COMMAND 2>> /PATH/TO/SOMEFILE
  错误输出追加重定向;
  合并标准输出与错误输出流:
  (1) &>, &>>
  (2) COMMAND > /PATH/TO/SOMEFILE 2>&1
  COMMAND >> /PATH/TO/SOMEFILE 2>&1
  特殊输出目标:/dev/null
  位桶:bit bucket
  特殊的输入文件:/dev/zero
  输入重定向:
  COMMAND < /PATH/FROM/SOMEFILE
  tee命令:
  tee – read from standard input and write to standard output and files
  tee [OPTION]… [FILE]…
  -a:使用追加输出,而非覆盖;
  COMMAND | tee /PATH/TO/SOMEFILE
# cat test|tee /tmp/test.cat  
Hello World
  
# cat /tmp/test.cat
  
Hello World
  i.bash特性之bash配置文件:
  bash配置文件的分两大类:
  1,全局配置,比如:/etc/profile, /etc/profile.d/*.sh, /etc/bashrc
  2,个人配置,比如:~/.bash_profile, ~/.bashrc
  其中,profile类的文件记录的是:1,设定环境变量; 2,运行命令或脚本;
  bashrc类的文件记录的是:1,设定本地变量;2,定义命令别名。
  详解:
  ~/.bash_logout
  这个文件记录"当我注销后,系统再帮我做完什么操作后才离开".可以读取这个文件的内容,默认情况下,注销时,bash只是清掉屏幕的消息.不过,也可以将一些备份或者其他你认为重要的工作写在这个文件中.
  /etc/profile系统整体的配置文件,该配置文件可以利用登陆者的UID来决定很多重要的变量信息,这也是每个用户登陆取得bash时一定会读取的配置文件,所以想要对所有用户设置整体环境,可对其进行修改。该文件设置的变量主要有:

  •   PATH:会根据UID决定PATH变量要不要含有sbin的系统指令目录;
  •   MAIL:根据帐户设置/var/spool/mail/账号名称;
  •   USER:根据用户的账号设置此变量内容;
  •   HOSTNAME:依据主机的hostname指令设置此变量的内容;
  •   HISTSIZE:历史命令记录数,一般设置成50,比较安全.
  /etc/profile不止完成上述内容,还会调用外部的设置资料:

  •   /etc/inputrc:用来设置bash的热键、[tab]是否有声音等信息;
  •   /etc/profile.d/*.sh:该目录下的文件规定了bash的操作界面、语系以及一些公共的命令别名。
  •   /etc/sysconfig/i18n:这个文件是由/etc/profile.d/lang.sh调用的,是决定bash默认使用何种语系的重要配置文件。 locale命令查看当前系统语言;
  •   修改语系为中文:
  • export LANG=”zh_CN.UTF-8″
  bash配置文件的加载顺序分两种,登录式shell和非登录式shell。
  1,登陆式shell是指:1,正常通过终端登录;2,su - username;3,su -l username;
  执行顺序是:/etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc
  2,非登录式shell是指:1,su username;2,图形终端下的打开命令窗口;3,自动执行的shell脚本;
  执行顺序是:~/bashrc -> /etc/bashrc -> /etc/profile.d/*.sh
  修改配置文件立即生效方法:
  1.退出重新登陆
  2.dot.或者source重读配置文件 . | source /etc/profile.d/apache.sh
  j、bash特性之帮助查询:
  Linux获取命令帮助方法:
whatis  

  
command --help
  

  
man and info
  

  
/usr/share/doc/
  

  
Red Hat documentation
  

  
其它网站和搜索
  whatis命令:
显示命令的简短描述  
每晚使用一个数据库更新
  
刚安装后不可立即使用
  
makewhatis(centos6) | mandb(centos7)制作数据库
  
whatis cal 或 man –f cal
  命令帮助:
  内部命令:help COMMAND | man bash
  外部命令:COMMAND --help | man COMMAND
  man命令的配置文件: /etc/man.config (centos6)| man_db.conf (centos7)
  MANPATH /PATH/TO/SOMEWHERE: 指明新手册文件搜索位置
  # man -M /PATH/TO/SOMEWHERE COMMAND: 到指定位置下搜 索COMMAND命令的手册页并显示
  man 章节:
  1: 用户命令
  2: 系统调用
  3: C库调用
  4: 设备文件及特殊文件
  5: 配置文件格式
  6: 游戏
  7: 杂项
  8: 管理类的命令
  9: Linux 内核API
  info命令:
  命令格式:info COMMAND
方向键, PgUp, PgDn 导航  
Tab键 移动到下一个链接
  
d 显示主题目录
  
Home 显示主题首部
  
Enter进入 选定链接
  
n/p/u/l 进入下/前/上一层/最后一个链接
  
s 文字 文本搜索
  
q 退出 info



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554721-1-1.html 上篇帖子: Linux shell 脚本监控cpu,内存,硬盘,网络,是否存活 下篇帖子: shell 按照天数打包文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表