引用
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)的提示符,不以美元符号结尾,而以井号(#)结尾,用来提醒用户,现在具有根权限。(~)表示当前所在目录,目前是为用户主目录。
基本语法
语法
- Bash 使用空格(或 Tab 键)区分不同的参数,多个空格忽略
- 分号(;)是命令的结束符
echo -n a;echo b
是两个命令,从左到右执行
- 使用&&符号连接两个命令,当前命令执行成功,才会执行后命令
Command1 && Command2
如果Command1命令运行成功,则继续运行Command2命令。
- 使用||符号连接两个命令,当前命令执行失败,才会执行后命令
Command1 || Command2
如果Command1命令运行失败,则继续运行Command2命令
echo命令
echo命令的作用是在屏幕输出一行文本,可以将该命令的参数原样输出。
- 输出多行文本时将文本放在引号中
echo "<HTML>
</HTML>"
- 末尾不换行 -n
echo -n a;echo b
输出
ab
- 默认情况下引号中的内容不解释("",'')为普通字符,若需要解释则使用 -e
$ echo -e "Hello\nWorld"
Hello
World
type命令
type命令用来判断命令的来源
$ type echo
echo is a shell builtin
$ type ls
ls is hashed (/bin/ls)
- 查看一个命令的所有定义(相同命令可能存在多个)-a
$ type -a echo
echo is shell builtin
echo is /usr/bin/echo
echo is /bin/echo
- 查看命令类型 -t
- 命令类型有:别名(alias),关键词(keyword),函数(function),内置命令(builtin)和文件(file)
$ type -t bash
file
$ type -t if
keyword
扩展模式
扩展打开与关闭
Bash 是先进行扩展,再执行命令。因此,扩展的结果是由 Bash 负责的,与所要执行的命令无关。命令本身并不存在参数扩展,收到什么参数就原样执行。
- set -o 查看shell功能打开情况
- noglob 关闭扩展功能 on(打开)的情况下关闭扩展 off时打开
- 使用 set -o noglob(set -f) 打开关闭扩展
- 使用 set +o noglob(set +f)关闭关闭扩展(就是打开了扩展)
文件名扩展(模式匹配)
*,?,[]
属于模式匹配
只有文件确实存在的前提下才会扩展,详细见下
~ 波浪线扩展
- 波浪线~会自动扩展成当前用户的主目录。
# echo ~/foo
/root/foo
- ~user表示扩展成用户user的主目录
$ echo ~root
/root
如果~user的user是不存在的用户名,则波浪号扩展不起作用。
- ~+会扩展成当前所在的目录,等同于pwd命令。
$ echo ~+
/home/me/foo
? 字符扩展
- ?字符代表文件路径里面的任意单个字符,不包括空字符。
$ ls ?.txt
a.txt b.txt
上面命令中,?表示单个字符,所以会同时匹配a.txt和b.txt。
- ? 字符扩展属于文件名扩展,只有文件确实存在的前提下,才会发生扩展。如果文件不存在,扩展就不会发生。
# 当前目录为空目录
$ echo ?.txt
?.txt
*字符扩展
- *字符代表文件路径里面的任意数量的任意字符(包括零个字符!!!)。
# 存在文件 a.txt、b.txt 和 ab.txt
$ ls *.txt
a.txt b.txt ab.txt
- 注意,*不会匹配隐藏文件(以.开头的文件),即ls 不会输出隐藏文件。如果要匹配隐藏文件,需要写成.
# 显示所有隐藏文件
$ echo .*
- *只匹配当前目录,不会匹配子目录。但Bash 4.0 引入了一个参数globstar,当该参数打开时,允许**匹配零个或多个子目录。
# 子目录有一个 a.txt
# 无效的写法
$ ls *.txt
# 有效的写法
$ ls */*.txt
- 注意,*字符扩展属于文件名扩展,只有文件确实存在的前提下才会扩展。如果文件不存在,就会原样输出。
方括号扩展
方括号扩展的形式是[...],匹配括号中的任意一个字符
# 存在文件 a.txt 和 b.txt
$ ls [ab].txt
a.txt b.txt
# 只存在文件 a.txt
$ ls [ab].txt
a.txt
- [^...]和[!...]。它们表示匹配不在方括号里面的字符
# 存在 aaa、bbb、aba 三个文件
$ ls ?[!a]?
aba bbb
-
如果需要匹配[字符,可以放在方括号内,比如[[aeiou]。如果需要匹配连字号-,只能放在方括号内部的开头或结尾,比如[-aeiou]或[aeiou-]。
-
方括号扩展属于文件名匹配,即扩展后的结果必须符合现有的文件路径。如果不存在匹配,就会保持原样,不进行扩展。
-
方括号扩展有一个简写形式[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
- 它会扩展成所有给定的值,而不管是否有对应的文件存在。ps:这里和上面不同了
$ ls {a,b}.txt
ls: 无法访问'a.txt': 没有那个文件或目录
ls: 无法访问'b.txt': 没有那个文件或目录
- 大括号内部的逗号前后不能有空格。否则,大括号扩展会失效。逗号前面可以没有值,表示扩展的第一项为空。
$ echo {1 , 2}
{1 , 2}
$ echo a.log{,.bak}
a.log a.log.bak
- 大括号可以嵌套,也可以与其他模式联用,并且总是先于其他模式进行扩展。
$ 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
- 使用第二个双点号(start..end..step),用来指定扩展的步长
$ echo {0..8..2}
0 2 4 6 8
变量扩展
- Bash 将美元符号$开头(或加上{})的词元视为变量,将其扩展成变量值
$ echo $SHELL
/bin/bash
$ echo ${SHELL}
/bin/bash
- ${!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
- $(...)可以嵌套,比如$(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${}
变量扩展$()
子命令扩展$(())
算数扩展