引用

https://wangdoc.com/bash/intro.html
https://wangdoc.com/bash/grammar.html
https://wangdoc.com/bash/expansion.html
基本上就是这个的总结

简介

[user@hostname] $
[root@VM-4-6-centos ~]# 

前缀是用户名(user)加上@,再加主机名(hostname)
($)是命令行环境的提示符。
根用户(root)的提示符,不以美元符号结尾,而以井号(#)结尾,用来提醒用户,现在具有根权限。(~)表示当前所在目录,目前是为用户主目录。

基本语法

语法

  1. Bash 使用空格(或 Tab 键)区分不同的参数,多个空格忽略
  2. 分号(;)是命令的结束符
echo -n a;echo b
是两个命令,从左到右执行
  1. 使用&&符号连接两个命令,当前命令执行成功,才会执行后命令
Command1 && Command2 
如果Command1命令运行成功,则继续运行Command2命令。
  1. 使用||符号连接两个命令,当前命令执行失败,才会执行后命令
Command1 || Command2
如果Command1命令运行失败,则继续运行Command2命令

echo命令

echo命令的作用是在屏幕输出一行文本,可以将该命令的参数原样输出。

  1. 输出多行文本时将文本放在引号中
echo "<HTML>
</HTML>"
  1. 末尾不换行 -n
echo -n a;echo b
输出
ab
  1. 默认情况下引号中的内容不解释("",'')为普通字符,若需要解释则使用 -e
$ echo -e "Hello\nWorld"
Hello
World

type命令

type命令用来判断命令的来源

$ type echo
echo is a shell builtin 
$ type ls
ls is hashed (/bin/ls)
  1. 查看一个命令的所有定义(相同命令可能存在多个)-a
$ type -a echo
echo is shell builtin
echo is /usr/bin/echo
echo is /bin/echo
  1. 查看命令类型 -t
  • 命令类型有:别名(alias),关键词(keyword),函数(function),内置命令(builtin)和文件(file)
$ type -t bash
file
$ type -t if
keyword

扩展模式

扩展打开与关闭

Bash 是先进行扩展,再执行命令。因此,扩展的结果是由 Bash 负责的,与所要执行的命令无关。命令本身并不存在参数扩展,收到什么参数就原样执行。

  1. set -o 查看shell功能打开情况
  2. noglob 关闭扩展功能 on(打开)的情况下关闭扩展 off时打开
  3. 使用 set -o noglob(set -f) 打开关闭扩展
  4. 使用 set +o noglob(set +f)关闭关闭扩展(就是打开了扩展)

文件名扩展(模式匹配)

*,?,[]
属于模式匹配
只有文件确实存在的前提下才会扩展,详细见下

~ 波浪线扩展

  1. 波浪线~会自动扩展成当前用户的主目录。
# echo ~/foo
/root/foo
  1. ~user表示扩展成用户user的主目录
$ echo ~root
/root

如果~user的user是不存在的用户名,则波浪号扩展不起作用。

  1. ~+会扩展成当前所在的目录,等同于pwd命令。
$ echo ~+
/home/me/foo

? 字符扩展

  1. ?字符代表文件路径里面的任意单个字符,不包括空字符。
$ ls ?.txt
a.txt b.txt

上面命令中,?表示单个字符,所以会同时匹配a.txt和b.txt。

  1. ? 字符扩展属于文件名扩展,只有文件确实存在的前提下,才会发生扩展。如果文件不存在,扩展就不会发生。
# 当前目录为空目录
$ echo ?.txt
?.txt

*字符扩展

  1. *字符代表文件路径里面的任意数量的任意字符(包括零个字符!!!)。
# 存在文件 a.txt、b.txt 和 ab.txt
$ ls *.txt
a.txt b.txt ab.txt
  1. 注意,*不会匹配隐藏文件(以.开头的文件),即ls 不会输出隐藏文件。如果要匹配隐藏文件,需要写成.
# 显示所有隐藏文件
$ echo .*
  1. *只匹配当前目录,不会匹配子目录。但Bash 4.0 引入了一个参数globstar,当该参数打开时,允许**匹配零个或多个子目录。
# 子目录有一个 a.txt
# 无效的写法
$ ls *.txt

# 有效的写法
$ ls */*.txt
  1. 注意,*字符扩展属于文件名扩展,只有文件确实存在的前提下才会扩展。如果文件不存在,就会原样输出。

方括号扩展

方括号扩展的形式是[...],匹配括号中的任意一个字符

# 存在文件 a.txt 和 b.txt
$ ls [ab].txt
a.txt b.txt

# 只存在文件 a.txt
$ ls [ab].txt
a.txt
  1. [^...]和[!...]。它们表示匹配不在方括号里面的字符
# 存在 aaa、bbb、aba 三个文件
$ ls ?[!a]?
aba bbb
  1. 如果需要匹配[字符,可以放在方括号内,比如[[aeiou]。如果需要匹配连字号-,只能放在方括号内部的开头或结尾,比如[-aeiou]或[aeiou-]。

  2. 方括号扩展属于文件名匹配,即扩展后的结果必须符合现有的文件路径。如果不存在匹配,就会保持原样,不进行扩展。

  3. 方括号扩展有一个简写形式[start-end],表示匹配一个连续的范围。比如,[a-c]等同于[abc],[0-9]匹配[0123456789]。
    常用例子:
    [a-z]:所有小写字母。
    [a-zA-Z]:所有小写字母与大写字母。
    [a-zA-Z0-9]:所有小写字母、大写字母与数字。
    [abc]*:所有以a、b、c字符之一开头的文件名。
    program.[co]:文件program.c与文件program.o。
    BACKUP.[0-9][0-9][0-9]:所有以BACKUP.开头,后面是三个数字的文件名。
    [!a-zA-Z]:匹配非英文字母的字符。

大括号扩展

大括号扩展表示分别扩展成大括号里面的所有值,各个值之间使用逗号分隔。比如,{1,2,3}扩展成1 2 3。

$ echo d{a,e,i,u,o}g
dag deg dig dug dog
  1. 它会扩展成所有给定的值,而不管是否有对应的文件存在。ps:这里和上面不同了
$ ls {a,b}.txt
ls: 无法访问'a.txt': 没有那个文件或目录
ls: 无法访问'b.txt': 没有那个文件或目录
  1. 大括号内部的逗号前后不能有空格。否则,大括号扩展会失效。逗号前面可以没有值,表示扩展的第一项为空。
$ echo {1 , 2}
{1 , 2}

$ echo a.log{,.bak}
a.log a.log.bak
  1. 大括号可以嵌套,也可以与其他模式联用,并且总是先于其他模式进行扩展。
$ echo {j{p,pe}g,png}
jpg jpeg png

$ echo /bin/{cat,b*}
/bin/cat /bin/b2sum /bin/base32 /bin/base64 ... ...

4.大括号扩展有一个简写形式,表示扩展成一个连续序列。支持逆序,但如果遇到无法理解的简写,大括号模式就会原样输出,不会扩展。

$ echo {a..c}
a b c

$ echo .mp{3..5}{a..b}
.mp3a .mp3b .mp4a .mp4b .mp5a .mp5b
  1. 使用第二个双点号(start..end..step),用来指定扩展的步长
$ echo {0..8..2}
0 2 4 6 8

变量扩展

  1. Bash 将美元符号$开头(或加上{})的词元视为变量,将其扩展成变量值
$ echo $SHELL
/bin/bash
$ echo ${SHELL}
/bin/bash
  1. ${!string*}或${!string@}返回所有匹配给定字符串string的变量名。
$ echo ${!S*}
SECONDS SHELL SHELLOPTS SHLVL SSH_AGENT_PID SSH_AUTH_SOCK

${!S*}扩展成所有以S开头的变量名。

子命令扩展

$(...)或``中可以扩展成另一个命令的运行结果,该命令的所有输出都会作为返回值。

$ echo $(date)
Tue Jan 28 00:01:13 CST 2020

$ echo `date`
Tue Jan 28 00:01:13 CST 2020
  1. $(...)可以嵌套,比如$(ls $(pwd))。

快捷键

  • Ctrl + L:清除屏幕并将当前行移到页面顶部。
  • Ctrl + C:中止当前正在执行的命令。
  • Shift + PageUp:向上滚动。
  • Shift + PageDown:向下滚动。
  • Ctrl + U:从光标位置删除到行首。
  • Ctrl + K:从光标位置删除到行尾。
  • Ctrl + D:关闭 Shell 会话。
  • ↑,↓:浏览已执行命令的历史记录。

命令符

  • bash 进入bash环境(非图形linux打开基本上就是)
  • bash --version 查看Bash版本
  • exit 退出bash环境
  • pwd 显示当前所在目录
  • echo 输出文本
  • type 判断命令来源

特殊字符

  • $$ 命令组合,左完成右执行
  • || 命令组合,左失败右执行
  • ~ 扩展用户主目录
  • ? 扩展单个非空字符
  • * 扩展任意个字符
  • [] 匹配括号中的一个或以[1-5]中的一个
  • {} 匹配大括号中的多个或以{1..5}中的全部
  • $or${} 变量扩展
  • $() 子命令扩展
  • $(()) 算数扩展