bash基本特性

Posted lz_equal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash基本特性相关的知识,希望对你有一定的参考价值。

特性之引用

  • 引号有三种类型:’, “, `

  • 字符引用

    • ’: 强引用,其内部的变量不会被替换; 也就是变量名本身。
    • “:弱引用,其内部的变量会被替换;实际使用的是变量的值,也就是内存对应存取的数据
    • `:命令引用。命令会被替换成命令的结果被使用
    • 变量引用:${NAME} ,可简写$NAME
# echo '$PATH' //强引用
$PATH
# echo "$PATH" //弱引用
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# echo `pwd`    // 命令引用
/home/testuser

特性:命令别名

定义个别名,我的理解就是将那些经常使用的操作组合用一个新的自定义命令来替代,来减少操作。用着顺手就算好别名,否则就是画蛇添足
- 获取当前用户可用的别名的定义:

# alias
- 定义别名:
# alias NAME=’COMMAND’

  • 别名的生命周期:当前shell进程;长期使用需写进配置文件中

  • 撤消别名:

    # unalias NAME

// 例如定义一个别名 ,这个别名其实就听无聊的
    [wang@10 ~]$ alias userPasswd='cat /etc/passwd'
    [wang@10 ~]$ userPasswd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    。。。。。。。。。

特性之:快捷键

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 + i 类似TAB健补全功能
ctrl + o 重复执行命令
alt + 数字键 操作的次数

特性:命令补全和路径补全

Tab Tab :
点击一下Tab剩余未出现路径或命令,没有分歧则补全剩余路径名或命令。
如果点一下没反应就是有分歧,点击2下Tab按键出现所有可选项,以供选择

- 命令补全:shell程序在接收到用户执行命令的请求且分析完成之后,最左侧字符串将被当作命令去查找;
- 查找机制:
- (1) 查找内部命令;
- (2) 查找外部命令:

1、去$PATH变量所指定的各路径下,自左而右逐个搜索各目录下的文件名;
2、给定的打头的字符串如果能惟一标识某命令程序文件的文件名,则直接补全;
3、不能惟一标识,再击tab可给列表;
4、错误:没有任何命令可被此打头字符串标识;
  • 路径补全:
在给定的起始路径的上级目录下,以对应路径下的打头字符串来逐一匹配上级目标下的每个文件:

惟一标识:tab补全;

不能惟一标识:tab, tab给出列表;

错误路径:没有响应;

特性之:命令行展开:

把命令行的给定的特殊符号自动替换为相应字符串的机制;

  • ~: 自动替换为用户家目录;

  • ~USERNAME:自动替换为指定用户的家目录;

  • {}:可承载一个以逗号分隔的路径列表,能够将其展开为多个独立路径;

例:命令行展开
/tmp/{a,b,c}  <-相当于-> /tmp/a /tmp/b /tmp/c 
/tmp/{a,b}/z  <-相当于-> /tmp/a/z /tmp/b/z 
//命令,一次性创建多个文件夹同时显示创建过程
[wang@10 tmp]$ mkdir -pv zp/{a/{a,b,c},b/{a,b,c},c/{a,b,c}}
mkdir: created directory ‘zp’
mkdir: created directory ‘zp/a’
mkdir: created directory ‘zp/a/a’
mkdir: created directory ‘zp/a/b’
mkdir: created directory ‘zp/a/c’
mkdir: created directory ‘zp/b’
mkdir: created directory ‘zp/b/a’
mkdir: created directory ‘zp/b/b’
mkdir: created directory ‘zp/b/c’
mkdir: created directory ‘zp/c’
mkdir: created directory ‘zp/c/a’
mkdir: created directory ‘zp/c/b’
mkdir: created directory ‘zp/c/c’
//结果 abc三个目录下各有abc3个目录。
[wang@10 zp]$ ls -r *
c:
c  b  a
b:
c  b  a
a:
c  b  a



例:特殊命令替换
命令: # cd ~
命令: # pwd
结果:/root
命令: # cd ~testuser
命令:testuser]# pwd
结果:/home/testuser //跳到testuser用户的家目录

特性之:命令的执行状态结果:

命令的正常输出结果:命令的返回值;适用于不需要看到命令执行的过程,只想知道这个命令是否执行成功了。可通过返回值加以判断

通过引用来保存下来或直接调用——”命令引用“

`COMMAND`

$(COMMAND)

# ls -ld `pwd`
  • 命令的执行状态结果:
    • 成功:0
    • 失败:1-255
# echo "Helllo World"
Helllo World
# echo $?
0
# echoa "Hello World"
-bash: echoa: command not found
# echo $?
127

特性之:glob文件名通配

glob:文件名通配;快速引用多个文件;文件名整体匹配度检测;

元字符:基于元字符可编写匹配模式(pattern);

  • *:匹配任意长度的任意字符;
// 星号附近给定的字母是约束,在满足约束条件后的任何字符都会被匹配到
p*,  pa*, *p, *p*a
  • ?:匹配任意单个字符;
p?, p?a, p?? //一个?号代表着一个任何字符,二个代表着2个 
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/

特性:命令历史

shell进程会保存其会话中用户曾经执行过的命令;命令通过其“历史文件”来持久保存此前执行过的命令;每个用户都有其自己专用的历史文件;
  • HISTSIZE:shell进程的缓冲区保留的历史命令的条数;
  • HISTFILESIZE:命令历史文件可保存的历史命令的条数;
    • 默认均为1000;
# echo $HISTSIZE
1000
# echo $HISTFILESIZE
1000
HISTFILE:当前用户的命令历史文件;
  • 查看命令历史列表:~/.bash_history

  • 命令用法:# history

    • history -c:清空命令历史;
    • history -d OFFSET:删除指定的条目;
      • # history -d 156
    • -a 将当前缓冲的历史行追加到历史文件中

    • -n 从历史文件中读取所有未被读取的行

    • -r 读取历史文件并将内容追加到历史列表中

调用命令历史列表中的命令以重执行之目的:

  • !#:再一次执行历史列表中的第#条命令;
\\# 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
  • 调用上一条命令的最后一个参数:
快捷键:ESC, .

Alt+.

!$:给出的字符组合

  • 显示最近的n条件命令历史:

    • history #
  • 控制命令历史的记录方式:

    • 通过HISTCONTROL环境变量进行,其取值:

      • ignoredups:忽略重复的命令;重复是指连续且相同的令;

      • ignorespace:以空白字符开头的命令不记入历史;

      • ignoreboth:上述两者同时生效;

  • 修改变量值的方式:

    • NAME=’VALUE’
\\# echo $HISTCONTROL
ignoredups
\\# HISTCONTROL="ignoreboth"
\\# echo $HISTCONTROL
ignoreboth

特性之:变量

变量:内存空间,有名称,名称即为变量名,对应的内存空间中的数据即为变量的值; 变量就是通过一个特点的名称,寻找到内存当中的一段数据。因为内存的数据是可以变更的,所以是变量。
- 点击变量,跳转链接

特性之:I/O重定向和管道

I/O重定向就是输入、输出本来都有设置好了。比如键盘输入,显示器输出。但是根据某些特别的需求,不需要从键盘中输入直接从文件中寻找已经设定的好的当做输入信息。返回的结果也不需要显示到显示器中,而是保存到文件中去。更改数据流本来要流入的地方到新的地方(一般是文件中)这就是I/O(输入输出)重定向

  • 程序的数据流有三个:
    • 输入数据流: <–,标准输入(stdin),键盘;代码为0,使用<或<<
    • 输出数据流:–>,标准输出(stdout), 显示器;代码为1,使用>或>>
    • 错误数据流:–>,错误输出(stderr),显示器;代码为2,使用2>或2>>
  • fd:file descriptor,文件描述符;描述符是简约标记数据流是哪个
    • stdin: 0 :键盘
    • stdout: 1 :显示器
    • stderr: 2 :显示器

IO重定向:

输入重定向

<:输入重定向
<<:此处创建文件,常用于在脚本中创建文件或生成菜单
<< EOF EOF 此处生成文件

输出重定向:

  • 覆盖重定向:覆盖目标文件中的原有内容;
    • COMMAND > /PATH/TO/SOMEFILE
  • 追加重定向:追加新产生的内容至目标文件尾部;
    • COMMAND >> /PATH/TO/SOMEFILE

shell的一个功能开关:

  • 禁止覆盖输出重定向至已存在的文件;

    • # set -C
      >|:在-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

同时重定标准输出和错误输出:
    命令 > /path/to/outfile 2>/path/to/errfile
    命令 &> /path/to/somefile 
    命令 > /path/to/somefile 2>&1

特殊输出目标:/dev/null

  • 位桶:bit bucket 。无底洞导入到这里的文件都无法恢复

特殊的输入文件:/dev/zero

  • 输入重定向:
    • COMMAND < /PATH/FROM/SOMEFILE

管道命令

管道用|表示,每一个管道后面第一个数据必定是命令,命令必须是能接收标准输入的数据才行。这样的命令才是管道命令
管道命令仅仅会处理标准输出,对于标准错误输出予以忽略
管道命令必须要能够接收来自前一个命令的数据成为标准输入继续处理才行

可以成为管道命令的:

选取命令:cut(从已有的信息里切出一段信息,信息已行为单位),grep(以行为单位,搜索出需要的信息,类似文本搜索)

排序命令:sort(排序文件),uniq(配合排序的文件删选重复的信息,wc(统计数据信息),

双向重定向:tee(即分流定向即向显示器输出信息,同时向文件输出信息保存)

字符转换命令:

tr命令:把输出的数据当中的字符,实现对位转换,即把数据中的存在于字符集中的字符,统统转换为字符集2中对应的字符;
col
join
paste
expand

文件切割命令:Split(按照指定大小或行数切割成小文件)

以上是关于bash基本特性的主要内容,如果未能解决你的问题,请参考以下文章

bash基本特性

bash基本特性及linux基本命令

bash基本特性及linux基本命令

sh Bash的代码片段

bash的基本特性

linux bash基本特性