Linux之bash shell特性

一、shell是什么?

Shell 本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

如图shell是一个应用程序,是用户管理应用程序的一个接口。Linux之bash shell特性

二、广义上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给出列表;

错误路径:没有响应;

相关推荐