目录
- 基础命令
- 变量
- 创建并运行脚本
- 条件
- 循环
- 函数
- 其他(read、mktemp、trap)
基础命令
下面的命令可以查看当前运行的Shell。
$ echo $SHELL
/bin/bash
下面的命令可以查看当前的 Linux 系统安装的所有 Shell。
$ cat /etc/shells
上面两个命令中,$是命令行环境的提示符,用户只需要输入提示符后面的内容。
用户可以通过bash命令的--version参数或者环境变量
$ bash --version
echo "$BASH_VERSION"
echo命令
echo命令的作用是在屏幕输出一行文本,可以将该命令的参数原样输出,加上引号。
$ echo "Hello\nWorld"
Hello\nWorld
$ echo -e "Hello\nWorld"
Hello
World
普通参数
Bash 使用空格(或 Tab 键)区分不同的参数。
$ command foo bar
配置参数
有些参数是普通参数,而有些参数则是命令的配置项,这些配置项一般都以一个连词线开头,比如下面命令中,-r和--reverse就是。
ls -r /home
ls --reverse /home
同一个配置项往往有长和短两种形式,比如-r是短形式,--reverse是长形式,它们的作用完全相同,短形式便于手动输入,长形式一般用在脚本之中,可读性更好,利于解释自身的含义。
命令的组合符
命令组合符可以帮空控制多个命令之间的继发关系,目前有三种情况,第一种情况是&&,第二种情况是||,第三种情况是;。
Command1 && Command2
上面命令的意思是,如果Command1命令运行成功,则继续运行Command2命令。
Command1 || Command2
上面命令的意思时,如果Command1命令执行成功,则不继续执行Command2命令。
Command1; Command2
上面命令的意思时,不论Command1命令执行是否成功,都不继续执行Command命令。
特殊字符扩展
如果参数中包含特殊字符,Shell首先会将将其扩展为完整内容,才会继续调用相应命令。
模式扩展与正则表达式的关系是,模式扩展早于正则表达式出现,可以看作是原始的正则表达式。它的功能没有正则那么强大灵活,但是优点是简单和方便。
- ~ 字符扩展
$ echo ~
/home/me
波浪号表示的是用户目录。
- ? 字符扩展
$ ls ?.txt
a.txt b.txt
问号表示的是任意单个字符,比如上面这个命令就可以获得只包含一个字符(任意字符)的txt文件。
- *字符拓展
$ ls *.txt
a.txt b.txt ab.txt
星号表示的是任意的0个或多个字符,比如上面的明亮就可以获得任意以.txt结尾的文件。
注意,ls *不会匹配隐藏文件(以.开头的文件),即ls 不会输出隐藏文件。如果要匹配隐藏文件,需要写成.。
echo */*.txt # 当前目录的所有单层子目录下,所有以.txt结尾的文件
echo **/*.txt # 当前目录的所有任意层子目录下,所有以.txt结尾的问题
- []字符扩展
ls [ab].txt # 当前目录的所有以a,b开头的,以.txt结尾的文件
ls [^ab]*.txt # 当前目录的所有不以a,b开头的,以.txt结尾的文件
引号与转义
$ echo "*"
*
双引号里面不会进行文件名扩展,比如通配符*是一个特殊字符,放在双引号之中,就变成了普通字符。但是,三个特殊字符除外:美元符号($)、反引号(`)和反斜杠(),这三个字符在双引号之中,依然有特殊含义,会被Bash自动扩展。
美元符号($)将拓展为环境变量内容
$ echo "${SHELL}"
/bin/bash
反引号(`)将拓展为命令的执行结果
$ echo "`date`" # echo "$(date)"
Mon Jan 27 13:33:18 CST 2020
反斜杠()将拓展为转义字符
$ echo "Hello\nWorld"
Hello
World
管道
在两个命令之间加一个|,就建立起两个命令之间的管道,管道主要用于处理上一个命令输出是下一个命令的输入这种情况。
比如我们希望统计~/.bashrc文件中的字符个数,我们就需要两个命令,第一个命令用于读出文件的内容(cat ~/.bashrc),第二个命令用于统计字符个数(wc -c),为了完成工作,我们可以在两个命令之间加上管道(|),将其结合起来,完成目标工作。
cat ~/.bashrc | wc -c
这样的例子还有很多,比如说我们想要查看进程中是否有java虚拟机的进行在运行,可以使用下面这个命令。
ps -ef | grep java