wshq 发表于 2018-8-21 09:59:09

Bash(Shell)基础知识

  shell,在英文中通常被翻译成壳,但是在Unix以及Linux中,它有着自己的定义:用户与操作系统之间完成交互式操作的一个接口程序。它为用户提供简化了的操作。当然从shell出现到现在有很多不同的shell:由贝尔实验室Bourne开发的Bourne Shell,简称sh;Bill Joy的C Shell;David Korn的Korn Shell,简称Ksh;GUN的Born Again Shell,简称bash(Linux系统的默认的Shell程序);Zsh。值得一提的是,这么多Shell中,Zsh的功能很强大,但是由于bash已经作为了Linux系统中的默认shell,否则的话,我认为Zsh可能会成为Linux系统中的默认shell。当然了,你如果想要使用Zsh,可以在自己的Linux系统安装。
  在Linux系统中,你如果想要查看都拥有哪些shell,你可以通过以下命令实现
# cat /etc/shells  
/bin/sh
  
/bin/bash
  
/sbin/nologin
  
/usr/bin/sh
  
/usr/bin/bash
  
/usr/sbin/nologin
  
/bin/tcsh
  
/bin/csh
  这里有几点需要注意的地方:1、除了/sbin/nologin以外,其他的shell都可以用来测试使用;2、在你想要更换shell时,并且你已经处在某个Shell中时,通过exit命令返回到bash时再进行切换。否则你会加大系统的负担。
  Bash作为Linux系统中默认的shell,是经常会用到的,那我们就来介绍一下Bash的特性:
  一命令的别名——(自定义命令)
  Alias
  定义或显示别名。
  格式:格式:alias [-p] [名称[=值] ... ]
  注意:如果alias命令不带任何选项和参数,则表示显示所有已经定义并生效的别名设置;
  # alias ALIAS=’COMMAND……’
  Unalias:
  从别名定义列表中删除每一个“名字”。
  格式:unalias[-a] 名称 [名称 ...]
# alias a='mkdir -pv'  
# a /xuwenlong/nan
  
mkdir: 已创建目录"/xuwenlong"
  
mkdir: 已创建目录"/xuwenlong/nan"
  
# unalias a
  
# a /xuwenlong/nan
  
bash: a: 未找到命令...
  注意:
  无论使用alias还是unalias命令,其功能都会立即生效;此二命令的生命期仅为当前shell的生命期;一旦注销登录,相当于关闭了bash,则使用这两个命令定义或者删除的别名操作会立即失效;
  对于每个用户来说,都有一个私有的bash的配置文件,就在用户的家目录中的一个隐藏文件,文件名为“.bashrc”,主要功能就是用来保存命令的别名的定义;
  注意:在对于此文件中的命令别名进行编辑并保存之后,在当前已经运行的bash中并不会立即生效,需要重新加载此文件才能使配置生效,以下两种操作皆可实现:
  1.重启bash:注销之后再次登录即可;
  2.执行文件中定义的命令:使用source或者.命令;
  Source/.
  在当前 shell 中执行一个文件中的命令。
  格式:Source或者. 文件名 [参数]
  二bash的快捷键
  C:ctrl键;
  M:alt键;
  E:esc键;
  DEL:backspse
  C-l:清屏是,相当于Clear命令;
  C-a:将光标跳转至命令行编辑模式的行首;
  C-e:将光标跳转至命令行编辑模式的行尾;
  C-k:删除光标所在位置至行尾的内容;
  C-u:删除光标所在位置至行首的内容;
  C-c:结束前台进程;
  M-.:引用上一个命令中的最后一个参数;(在Xshell中不好用)
  E,.:功能同M-.。
  三命令历史
  Bash进程会保存其会话中的用户曾经执行过得命令,以方便用户重复执行某个命令操作;
  命令历史包括两个方面:
  1用户曾经执行过的命令;
  2用户曾经执行过的路径;
  在bash中有一个内置的变量——PATH,PATH变量的值为当前系统中所有的命令的文件的所在路径的集合;
  命令是如何被SHELL执行的?
  Bash会将命令行的内容按照空白字符进行切片,分析第一个切片内容:判断第一个切片的内容是内部命令还是外部命令;如果是内部命令,则直接运行;如果是外部命令,先找hash表中的路径缓存,如果有则直接执行;否则需要通过查找PATH变量中包含路径中,是否有对应名称的文件。
  使用hash命令查看被记住的命令文件的路径;
  -r:清空hash表;
  使用history命令查看被记住的命令的命令行参数;
  Displayor manipulate the history list.
  格式:history[-c] [-d offset] or history -anrw or history -ps arg
  常用选项:
  -c:清空历史缓冲区中的命令历史记录;
  -dOFFSET:删除指定的历史命令条目;
   # history  
   1 ls
  
   2 cat
  
   3 history -d 1
  
   4 history
  
   # history -d 1
  
   # history
  
   1cat
  
   2 history -d 1
  
   3 history
  
   4 history -d 1
  
   5 history
  重复执行历史缓冲区中的命令:
  !COMMAND:重复执行历史缓冲区中编号为“NUMber”的命令;
  !STRING:重复执行历史缓冲区中以“STRING”开头的最后一次执行过得命令;
  !?STRING:重复执行历史缓冲区中包含了“STRING”的最后一次执行过得命令;
  !-NUMBER:重复执行历史缓冲区中倒数第”NUMBER”条命令;
  使用上、下箭头可以从历史缓冲区中调用命令,回车之后执行;
  C-r:在历史缓冲去中实施搜索,回车并执行对应命令;
  !$:在历史缓冲区中调用最后一个命令的最后一个参数;
  !^:表示在历史缓冲区中调用最后一个命令的第一个位置参数;
  !:NUMBER:在历史缓冲区中调用最后一个命令的第“NUMBER”位置参数;
  !NUMBER:NUMBER:在历史缓冲区中调用第“SEQUENCE”条命令中第“NUMBER”位置参数;
  在bash中与命令历史相关的内置变量:
  HISTSIZE:历史缓冲区中能够保存的命令历史的最大条目数量,默认1000;
  HISTFILSIZE:~/.bash_history文件中能够保存的最大条目数量,默认1000;HISTTIMEFORMAT:在命令历史缓冲区中,记录历史命令式,同时记录命令执行的时间戳标记;可以使用date命令的FORMAT来表示时间的记录格式;默认值为空;
  HISTCONTROL:控制命令历史的记录方式;
  ignoredups:忽略连续且相同的命令被记录到历史缓冲区;此为默认值;
  ignorespace:以空白字符开头的命令不会被记录到历史缓冲区;
  ignoreboth:上述两种情况都不会被记录到历史缓冲区;0
  四命令补全——TAB键
  包括两个方面的内容:
  1.构成命令字符串的补全;
  参考PATH变量中的路径,对命令进行补全;
  如果给出的字符串在PATH变量对应的路径中唯一的,则直接补全命令;
  如果给出的字符串在PATH变量对应的路径中是不唯一的,则bash给出提示;
  2.以及命令中参数所对应的字符串补全;
  根据给出的路径进行补全:
  如果给出的字符串在给出路径中对应的路径中唯一的,则直接补全参数;
  如果给出的字符串在给出路径中对应的路径中是不唯一的,则bash给出提示;
  五命令行展开
  1 ~展开:
  ~:bash会自动将其展开为当前登录用户的家目录;
  ~STRING:bash会自动将其展开为以“STRING”为用户名的用户的目录;
  ~+:调用bash的内置变量“PWD”的值;
  ~-:调用bash的内置变量“OLDPWD”的值;
  2{}展开:
  在“{}”中,可以填充一个以“,”来分隔的路径的列表,bash会将其展开为多个独立的路径;
  六命令的执行结果
  在bash中,命令的执行结果有两种:
  1、执行命令的输出结果;
  根据用户的需求获取到的命令执行的正常输出结果;
  命令引用或命令替换:
  (波浪键英文输入)` ` 相当于$()
  ``:反向单引号,反引号;
  2、执行命令的状态返回值;
  此前的一个命令是否成功执行相关的返回内容;
  Bash使用一个特殊的内置变量来保存其内容:$?
  $?实际上保存的是一个数值,其取值范围:0-255
  其中:
  0:表示命令执行成功;
  1-255:表示命令执行失败;
  1,2,127,是bash中内置的命令执行失败的状态返回值;
  1:表示一些小问题;
  2:表示严重问题;
  127:表示命令本身出现问题;
  其余数字(3-126,128-255):用户可以自定义的失败状态返回值;
  七引用功能
  ‘’:强引用
  凡是被单引号引用的内容,bash在处理时,一律视其为普通字符,即使其本身是bash定义的具有特殊功能和作用字符亦是如此,但单引号本身除外;
  “”:弱引用
  被双引号引用到的内容中,有些特殊字符仍然会保留其特殊含义,如:$,\,””;
  八转义功能:
  \:bash定义的转义字符;大多数情况下“\”只能将其后面一个字符转义;
  \COMMAND:取消定义过的命令别名,而使用命令本身的功能;
    # ls  
    aanaconda-ks.cfga.txt a.txt.bakbb.txt initial-setup-ks.cfgtest-       test-date+%F-%H公共模板视频图片文档下载音乐桌面
  
    # \ls
  
    aanaconda-ks.cfga.txt a.txt.bakbb.txt initial-setup-ks.cfgtest-      test-date+%F-%H公共模板视频 图片文档下载音乐桌面
  九 Globbing——文件名通配符,简称为globa;
  *:匹配任意长度的任意字符或字符串;(某些特殊位置的“.”字符不匹配)
  ?:匹配任意单个字符;(某些特殊位置的“.”字符不匹配)
  []:匹配指定范围内的任意单个字符,必须匹配且只能匹配一个字符;
  指定范围方法:
  1枚举法:列出所有有效字符;
  2范围指定:
  :表示所有单个的十进制数字;
  :a,A,b,B….z
  :A,b,B…..z,Z
  3bash内建字符集;
  [:lower:]:所有的小写字母
  [:upper:]:所有的大写字母
  [:alpha:]:所有字母,大小写字母;
  [:digit:]:所有单个的十进制数字;
  [:alnum:]:所有的字母和十进制数字;
  [:punct:]:所有的符号
  [:space:]:表示空白字符,包括空格和制表符;
  4反向匹配
  ^:
  示例:# ls [^[:digit:]]??//表示文件名的第二个字符不能是十进制数字;
  注意:当中括号中有^表示字符集反向匹配时,注意“*”的使用;因为“*”的通配范围可能会导致反向匹配失败;此类失败是因为bash的globbing是在贪婪模式下匹配的;
   # ls -d man  
   man1man2 man3man4man5 man6man7man8 man9
  
   # ls -d /etc/*.conf
  
   /etc/man_db.conf/etc/pbm2ppa.conf/etc/request-key.conf                  /etc/mke2fs.conf/etc/pnm2ppa.conf/etc/resolv.conf
  
   /etc/mtools.conf/etc/radvd.conf   /etc/rsyncd.conf
  十管道
  | :管道通常是用来连接多个命令的:将管道符号前面的命令的执行的输出结果通过管道传递给管道符号后面的命令,让后面的命令将前面的命令的输出结果当成参数使用;
  WC:
  wc - print newline, word, and bytecounts for each file
  格式:wc ......
  常用选项:
  -c, --bytes:仅显示文件中的字节数;
  -m, --chars:仅显示文件中的有效字符的数量;
  -l, --lines:仅显示文件的行数;
  -w, --words:仅显示文件中字的数量;
  注意:
  1一般来讲,凡是被管道连接的命令,都应该能够在执行成功之后完成命令结果的输出,否则管道无意义;
  2管道不是万能的,有些场合没办法使用管道的;
# wc a.txt  
    10 10 145 a.txt
  
    # wc -c a.txt
  
    145 a.txt
  
    # wc -l a.txt
  
    10a.txt
  
    # wc -w a.txt
  
    10a.txt
  十一输入输出重定向
  在使用计算机的时候,实现某个功能的主体是程序!
  程序=指令 +数据
  数据至关重要!
  文件,IO——Input/OUTput
  在Linux系统中,能够完成输入和输出功能的实体:文件
  可以用于输入的设备:文件
  键盘设备,文件系统中的常规文件、网卡设备、磁盘设备等;
  可以用于输出的设备:文件
  显示器、文件系统中的常规文件、网卡设备、声卡设备、磁盘设备等;
  在内存中使用文件的方式是定义文件描述符,一个文件描述符就对应一个文件;
  0:表示标准输入,stdin,凡是从键盘实现的输入数据流;
  1:表示标准输出,stdout,到显示器的输出数据流;
  3:表示标准错误,stderr,到显示器的错误数据流;
  输入输出重定向(IO重定向)
  采用非标准设备文件实现的IO操作;
  输入重定向:
  :覆盖输出重定向;
# catout_ridirect  
1
  
# echo 2> out_ridirect
  
# catout_ridirect
  
2
  保护锁定
  ~]# set –C   //开启防止意外覆盖源文件开关(“>|”可以完成覆盖重定向输出的操作,而无需关心是否开始此开关)
# set –C  
# echo 3> out_ridirect
  
-bash: out_ridirect: cannotoverwrite existing file
  ~]# set +C   //关闭防止意外覆盖源文件开关
  >>:追加输出重定向;
  错误重定向:
  2>:覆盖错误重定向;
  2>>:追加错误重定向;
  合并标准输出和标准错误的重定向:
  COMMAND{>|>>}/PATH/TO/SOMEFILE 2>&1
# ls a.txt &> b.txt  
# cat b.txt
  
a.txt
  
# rm -rf a.txt
  
# ls a.txt &> b.txt
  
-bash: b.txt:cannot overwrite existing file
  
# ls a.txt &>> b.txt
  
# cat b.txt
  
a.txt
  
ls: 无法访问a.txt: 没有那个文件或目录
  &>,&>>
  特殊的设备文件:
  /dev/null:BlackHole,BitBucket(位桶)
  /dev/zero:泡泡机,吐零机;
  Bash中的其他特殊符号:
   asdasdasd
  
> asdasdasdas
  
> adasdads
  
> new
  
asd
  
asdasdasd
  
asdasdasdas
  
adasdads
  
页: [1]
查看完整版本: Bash(Shell)基础知识