Bash shell 知识点汇总

1、~/.bash_history 记录的是前一次登录以前所执行过的命令

2、type可以查询命令是否为bash shell的内置命令
语法:

type [-tpa] name

:不加任何参数,type会显示出name是外部命令还是内置命令
-t:显示出它的意义
file:表示为外部命令
alias:表示该命令我命令别名所设置的名称
builtin:表示该命令为bash内置的命令功能
-p:如果为外部命令时,才会显示完整文件名
-a:会由path变量定义的路径中,将所有含有name的命令都列出来,包含alias
例如:
#bash内置命令

 [root@vidar-ali ~]# type cd
cd is a shell builtin
[root@vidar-ali ~]# type -t cd
builtin
[root@vidar-ali ~]# type -p cd
[root@vidar-ali ~]# type -a cd
cd is a shell builtin
cd is /usr/bin/cd

#命令别名

[root@vidar-ali ~]# type ls
ls is aliased to `ls --color=auto'  
[root@vidar-ali ~]# type -t ls
alias
[root@vidar-ali ~]# type -p ls
[root@vidar-ali ~]# type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls

#外部命令

[root@vidar-ali ~]# type yum
yum is hashed (/usr/bin/yum)
[root@vidar-ali ~]# type -t yum
file
[root@vidar-ali ~]# type -p yum
/usr/bin/yum
[root@vidar-ali ~]# type -a yum
yum is /usr/bin/yum

3、命令行快速编辑
ctrl+u ——从光标处向前删除命令串(不包含光标内容)
ctrl+k ——从光标后先后删除命令串(包含光标内容)
ctrl+a ——移动光标到命令行最前面
ctrl+e ——移动光标到命令行最后面

4、若shell变量为扩增变量内容时,则可用"$变量名称" 或 ${变量} 累加内容,如:

PATH="PATH":/home/bin 或 PATH=${PATH}:/home/bin

5、子进程:
在当前shell的情况下,去启用另一个新的shell,新的shell就是子进程。一般来说,父进程的自定义变量无法在子进程内使用,通过export将变量变成环境变量后,就能够使用。unset name 取消变量名的设置。

6、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时,提示符为:# ,普通用户则为:$

例如:

[root@vidar-ali ~]# PS1='[\u@\h \w \A \#]\$'
[root@vidar-ali ~ 19:39 56]#

7、locale 查询语系变量,cat /etc/locale.conf 可以设置系统整体的默认语系

8、read [-pt] variable(变量键盘读取)
-p:后面可以接提示字符
-t:后面可以接等待的秒数
例如:

[root@vidar-ali ~]# read -p "请输入自己的名字:" -t 10 named
请输入自己的名字:zhang
[root@vidar-ali ~]# echo $named
zhang

9、declare [-aixr] variable 声明变量的类型
-a:指定变量为数组类型
-i:指定变量为整数类型
-x:指定变量为环境变量
-r:将变量设置为制度类型,不可更改,也不能unset
例如:

[root@vidar-ali ~]# sum=100+200+300
[root@vidar-ali ~]# echo $sum
100+200+300
[root@vidar-ali ~]# declare -i sum=100+200+300
[root@vidar-ali ~]# echo $sum
600

如果不小心将变量设置为【只读】,通常要注销再登录才能恢复该变量的类型。

   #将sum设置为环境变量
    [root@vidar-ali ~]# declare -x sum
    [root@vidar-ali ~]# export | grep sum
    declare -ix sum="600"
    #把sum设置为只读属性
    [root@vidar-ali ~]# declare -r sum
    [root@vidar-ali ~]# sum=100
    -bash: sum: readonly variable
    #把sum变为非环境变量
    [root@vidar-ali ~]# declare +x sum
    [root@vidar-ali ~]# declare -p sum
    declare -ir sum="600"

10、如果想要让用户建立的文件不要太大时,我们是可以考虑ulimit来限制用户可以建立的文件大小,使用ulimit -f就可以来设置。
11、历史命令:history
选项与参数:
n:数字,意思是要列出最近的n条命令行表的意思
-c:将目前的shell中所有history内容全部清除
-a:将目前新增的history命令正如histflies中,若没有,默认写入~/. bash_history
-r:将histfiles的内容读到目前这个shell的history中
-w:将目前的history记录内容写入histfiles中

11、历史命令的特殊用法:
!number ——执行第几条命令的意思
!command ——由最近的命令向前查找的那个命令,并执行(command为命令的开头关键字)
!! ——执行上一个命令
12、最后注销的bash才会最后写入history的数据

13、路径与命令查找工具
①以相对/绝对路径执行命令,例如:【/bin/ls】或【./sh】
②由alias找到该命令来执行
③由bash内置的(builtin)命令来执行
④通过$PATH这个变量的顺序查找到的第一个命令来执行
(通过type -a [命令] 可以查询到顺序)
14、cat /etc/issue 设置bash的登录信息
\d ——本地端时间的日期
\l ——显示第几个终端
\m ——显示硬件的等级(i386等)
\n ——显示主机的网络名称
\O ——显示domain name
\r ——操作系统版本
\t ——显示本地端时间的时间
\S ——操作系统的名称
\v ——操作系统的版本
15、 cat /etc/motd 设置bash的欢迎信息
例如:

 [root@vidar-ali ~]# cat /etc/motd

Welcome to Alibaba Cloud Elastic Compute Service !

16、login shell需要输入账号和密码,non-login shell不需要输入密码(子进程)
17、login shell 只会读取/etc/profile 和 ~/.bash_profile (或 ~/.bash_login 或 ~/.profile)

profile文件:

[root@vidar-ali ~]# cat /etc/profile
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}


if [ -x /usr/bin/id ]; then
    if [ -z "$EUID" ]; then
        # ksh workaround
        EUID=`/usr/bin/id -u`
        UID=`/usr/bin/id -ru`
    fi
    USER="`/usr/bin/id -un`"
    LOGNAME=$USER
    MAIL="/var/spool/mail/$USER"
fi

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
else
    pathmunge /usr/local/sbin after
    pathmunge /usr/sbin after
fi

HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
    export HISTCONTROL=ignoreboth
else
    export HISTCONTROL=ignoredups
fi

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi

for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then 
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

unset i
unset -f pathmunge

bash_profile文件:

[root@vidar-ali ~]# cat .bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

18、最终被读取的文件为【~/.bashrc】

19、source读入环境配置文件的命令,不用注销登录就可以加载

20、如果出现【-bash-4.2$】这个情况,说明没调用/etc/bashrc来规范PS1变量,可以复制/etc/skel/.bashrc到家目录,然后自定义内容后,用source加载

21、终端环境配置stty

[root@vidar-ali ~]# stty -a
speed 38400 baud; rows 28; columns 74; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;

#几个重要关键词的意义:
intr:发送一个interrupt(中断)信号给目前正在运行的程序,就是终止程序运行ctrl+C
quit:发送一个quit信号给目前正在run的程序ctrl+\
erase:向后删除字符串ctrl+?
kill:删除在当前光标前的所有文字ctrl+U
eof:End of file的意思,代表结束输入。例如邮件结束的时候ctrl+D
stop:将目前程序停止运行,不能进行任何操作。例如:我们在vim时,按下ctrl+s此时终端就会卡住,不能就行任何操作。可以使用使用start重新启动ctrl+S
start:在某个程序停止(stop)后,重新启动它的output。ctrl+Q

22、终端环境设置set
作用:不用任何参数时,查看当前的环境变量,设置命令行输入/输出的环境
set [参数]

参数选项:
-u:默认不启用,若启用后,当使用未设置的变量时,会显示错误信息
-v:默认不启用,若启用后,在信息被输出前,会先显示信息的原始内容
-x:默认不启用,若启用后,在命令被执行前,会显示命令内容(前面有++号)
-h:默认启用,与历史命令有关
-H:默认启用,与历史命令有关
-m:默认启用,与任务管理有关
-B:默认启用,与中括号[ ]的作用有关
-C:默认不启用,若使用>等,则若文件存在时,该文件不会被覆盖

23、bash默认组合键汇整
ctrl+C 终止目前的命令
ctrl+D 输入结束(EOF),例如邮件结束的时候
ctrl+M 就是回车
ctrl+S 暂停屏幕
ctrl+Q 恢复屏幕
ctrl+U 在提示符下,将整列命令删除
ctrl+Z 暂停目前的命令

24、通配符与特殊符号
通配符:

符号 意义
/* 代表『 0 个到无穷多个』任意字符
? 代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

特殊符号:

符号 内容
# 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行
\ 跳脱符号:将『特殊字符或通配符』还原成一般字符
; 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
~ 用户的家目录
$ 取用变量前导符:亦即是变量之前需要加的变量取代值
& 工作控制 (job control):将命令变成背景下工作
! 逻辑运算意义上的『非』 not 的意思!
/ 目录符号:路径分隔的符号
>, >> 数据流重导向:输出导向,分别是『取代』与『累加』
<, << 数据流重导向:输入导向 (这两个留待下节介绍)
’ ’ 单引号,不具有变量置换的功能
" " 具有变量置换的功能!
` ` 两个『 ` 』中间为可以先运行的命令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ } 在中间为命令区块的组合!

25、EOF写法

cat << EOF >> 文件名(追加)
...内容...
EOF

cat << EOF > 文件名(覆盖)
...内容...
EOF

26、判断式通常写法

command1 && command2 || command3

27、选取命令:cut
cut命令可以将一段信息的某一段选取出来,信息处理一行为单位。CUT命令使用格式如下:

[root@vidarz ~]# cut -d'分隔字符' -f fields 			<==用于有特定分隔字符
[root@vidarz ~]# cut -c 字符区间            			<==用于排列整齐的信息

选项与参数:
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
例如:

[root@vidar-ali ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@vidar-ali ~]# echo $PATH | cut -d ':' -f 2,4
/usr/local/bin:/usr/bin

注意:last | cut -d ’ ’ -f 3 命令无法达到预期效果,因为相隔不止一个空格。

28、选取命令:grep
cut是将一行信息当中,取出某部分我们想要的,而grep则是分析一行信息, 若当中有我们所需要的信息,就将该行拿出来。其使用方法如下:

[root@vidarz ~]# grep [-acinv] [--color=auto] '查找字符' filename

选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 ‘搜寻字符串’ 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
–color=auto :可以将找到的关键词部分加上颜色的显示!
例如:

[root@vidar-ali ~]# last | grep 'root'
root     pts/1        218.75.36.170    Thu Jul  4 11:10   still logged in   
root     pts/0        218.75.36.170    Thu Jul  4 09:17   still logged in   
root     pts/0        218.75.36.170    Thu Jul  4 09:07 - 09:16  (00:09)    
root     pts/0        218.75.36.170    Wed Jul  3 09:13 - 21:12  (11:59)    
root     pts/0        218.75.36.170    Mon Jul  1 16:11 - 19:46  (03:34)    
root     pts/0        218.75.36.170    Thu Jun 27 16:37 - 19:04  (02:26)    
[root@vidar-ali ~]# last | grep 'root' | cut -d ' ' -f 1
root
root
root
root
root
root
[root@vidar-ali ~]# last | grep -v 'root'
reboot   system boot  3.10.0-957.21.3. Thu Jun 27 23:07 - 16:42 (6+17:34)

29、排序命令:sort、wc、uniq
①sort可以帮我们对输出数据进行排序,并且可以依据不同的数据类型来排序。

sort [-fbMnrtuk] [file or stdin]

选项与参数:
-f 忽略大小写差异,例如A和a视为相同
-b 忽略最前面的空格符部分
-M 以月份的名字来排序,如JAN,DEC等的排序方法
-n 使用“纯数字”进行排序(默认按文字类型排序的)
-r 反向排序
-u uniq,相同的数据,仅仅出现一行
-t 分隔符,默认用[Tab]键来分割
-k 以哪个区间(field)来进行排序
例子:

cat filename | sort     #默认对第一个数据进行排序,并且默认以文字类型排序
cat filename | sort -t ':' -k 3  #以:分割内容,以第三列的数据进行排序

②排序后,重复的数据只想看到一个,用uniq。

uniq [-ic]

-i 忽略大小写
-c 进行计数
例如:

[root@vidar-ali ~]# last | awk '{print $3}'
218.75.36.170
218.75.36.170
218.75.36.170
218.75.36.170
218.75.36.170
218.75.36.170
boot

Wed

[root@vidar-ali ~]# last | awk '{print $3}' | uniq -c
      6 218.75.36.170
      1 boot
      1 
      1 Wed

③WC命令用于统计文件多少行、多少字、字符数

wc [-lwm]

参数:
-l 仅列出行
-w 仅列出多少字(英文单字)
-c 仅列出多少字符
例子:

wc testfile testfile_1 testfile_2   #统计三个文件的信息,依次列出行数、字数、字符数

30、双向重定向:tee
tee会同时将数据流分送到文件与屏幕(Screen),而输出到屏幕的,其实就是stdout。
参数:
-a:以累加方式将数据加入到file中(默认是覆盖)

31、字符转换命令
①tr可以删除一段信息的的文字或者进行文字的替换

tr [-ds] SET1

参数:
-d:删除信息当中的SET1这个字符
-s:替换掉重复的字符
②col可以将tab键转换为空格键
参数:
-x:将tab将转换成对等的空格键
③join可以将两个文件中有相同数据的一行加在一起

join [-til2] file1 file2

参数:
-t:join默认以空格字符分隔数据,并且对比【第一栏位】的数据,如果两个文件相同,则将两条数据连成一行,且第一栏位放在第一个
-i:忽略大小写
-1:以第一栏位来分析
-2:以第二栏位来分析
④paste将文件两行贴在一起,以tab分隔
参数:
-d:后面可以接分隔字符,默认为tab

  • :如果file部分写成-,表示来自标准输入数据的意思。
    ⑤expand可以将tab键转换为空格键
    参数:
    -t:后面可接数字,自定义一个tab按键代表多少字符

32、划分命令:split
split可以把一个大文件依据文件大小或者行数来划分。

split [-bl] file PREFIX

参数:
-b:可接欲划分文件的大小
-l:以行数来进行划分
PREFIX:前缀字符
注意:如何把小文件合成一个文件
例如:
cat services* >>servicesback

33、参数代换:xargs
之所以使用xargs,是因为很多命令其实并不支持管道命令,因此我们可以通过xargs来提供该命令使用标准输入。
用法:

xargs [-0epnd] command

参数:
-0: 如果输入的stdin含有特殊字符,例如`, , 空格键等字符时,这个参数可以将它还原成一般字符。这个参数可以用于特殊状态。
-e:这个是EOF(end of file)的意思。后面可以接一个字符串,当xargs分析到这个字符串时,就会停止工作。(不要有空格)
-p:在执行每个命令的参数时,都会询问用户。
-n:后面接次数,每次command命令执行时,要使用几个参数。
-d:使用自己的定义的定界符来分隔参数。
-I:大写i,将xargs的每项名称,一般是一行一行赋值给{},可以{}代替。使用-i的时候,命令以循环的方式执行。如果有3个参数,那么命令就会连同{}一起被执行3次。在每一次执行中{}都会被替换为相应的参数。

例如:
将所有的/etc/passwd内的账号都以id查看,但查到sync就结束命令串

[root@vidar-ali ~]# cut -d ':' -f 1 /etc/passwd | xargs -e'mail' -n 1 id
uid=0(root) gid=0(root) groups=0(root)
uid=1(bin) gid=1(bin) groups=1(bin)
uid=2(daemon) gid=2(daemon) groups=2(daemon)
uid=3(adm) gid=4(adm) groups=4(adm)
uid=4(lp) gid=7(lp) groups=7(lp)
uid=5(sync) gid=0(root) groups=0(root)
uid=6(shutdown) gid=0(root) groups=0(root)
uid=7(halt) gid=0(root) groups=0(root)

34、关于减号【-】的用途
一般来说,如果需要用到stdout或者stdin时,当偏偏又没有文件,可以使用 - 号代替


参考博客:
https://blog.csdn.net/qq_41453285/article/details/88043991
https://www.cnblogs.com/ggjucheng/archive/2012/10/30/2746963.html
https://www.cnblogs.com/wxgblogs/p/6876189.html
https://blog.csdn.net/weixin_39731083/article/details/82226595
https://blog.csdn.net/miouqi/article/details/73350797

你可能感兴趣的:(shell,linux,bash)