Bash最基本的语法
循环和条件判断—Bash
Vim快捷键
运算符----Bash
数组----Bash
字符串—Bash
变量----Bash
Bash最基本的语法
echo命令
echo
命令的作用是在屏幕输出一行文本,可以将该命令的参数原样输出。
-
echo -n
默认情况下,会有回车符;参数-n
会取消回车符$ echo a;echo b a b $ echo -n a;echo b ab
-
echo -e
-e
参数会解释引号(双引号和单引号)里面的特殊字符(比如换行符\n
)。如果不使用-e
参数,即默认情况下,引号会让特殊字符变成普通字符,echo
不解释它们,原样输出。$ echo "Hello\nWorld" Hello\nWorld # 双引号的情况 $ echo -e "Hello\nWorld" Hello World # 单引号的情况 $ echo -e 'Hello\nWorld' Hello World
type 命令
Bash 本身内置了很多命令,同时也可以执行外部程序。怎么知道一个命令是内置命令,还是外部程序呢?
type
命令用来判断命令的来源。
$ type echo
echo is a shell builtin
$ type ls
ls is hashed (/bin/ls)
上面代码中,type
命令告诉我们,echo
是内部命令,ls
是外部程序(/bin/ls
)。
type -a
查看一个命令的所有定义type -t
可以返回命令的类型:别名(alias),关键词(keyword),函数(function),内置命令(builtin)和文件(file)。
[start-end]扩展
方括号扩展有一个简写形式[start-end]
,表示匹配一个连续的范围。比如,[a-c]
等同于[abc]
,[0-9]
匹配[0123456789]
。
# 存在文件 a.txt、b.txt 和 c.txt
$ ls [a-c].txt
a.txt
b.txt
c.txt
# 存在文件 report1.txt、report2.txt 和 report3.txt
$ ls report[0-9].txt
report1.txt
report2.txt
report3.txt
...
下面是一些常用简写的例子。
[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.
开头,后面是三个数字的文件名。
这种简写形式有一个否定形式[!start-end]
,表示匹配不属于这个范围的字符。比如,[!a-zA-Z]
表示匹配非英文字母的字符。
$ echo report[!1–3].txt
report4.txt report5.txt
上面代码中,[!1-3]
表示排除1、2和3。
{start…end} 扩展
大括号扩展有一个简写形式{start..end}
,表示扩展成一个连续序列。
这个写法的另一个常见用途,是直接用于for
循环。
for i in {1..4}
do
echo $i
done
上面例子会循环4次。
字符类
[[:class:]]
表示一个字符类,扩展成某一类特定字符之中的一个。常用的字符类如下。
[[:alnum:]]
:匹配任意英文字母与数字[[:alpha:]]
:匹配任意英文字母[[:blank:]]
:空格和 Tab 键。[[:cntrl:]]
:ASCII 码 0-31 的不可打印字符。[[:digit:]]
:匹配任意数字 0-9。[[:graph:]]
:A-Z、a-z、0-9 和标点符号。[[:lower:]]
:匹配任意小写字母 a-z。[[:print:]]
:ASCII 码 32-127 的可打印字符。[[:punct:]]
:标点符号(除了 A-Z、a-z、0-9 的可打印字符)。[[:space:]]
:空格、Tab、LF(10)、VT(11)、FF(12)、CR(13)。[[:upper:]]
:匹配任意大写字母 A-Z。[[:xdigit:]]
:16进制字符(A-F、a-f、0-9)。
字符类的第一个方括号后面,可以加上感叹号!
量词语法
量词语法用来控制模式匹配的次数。
量词语法有下面几个。
?(pattern-list)
:匹配零个或一个模式。*(pattern-list)
:匹配零个或多个模式。+(pattern-list)
:匹配一个或多个模式。@(pattern-list)
:只匹配一个模式。!(pattern-list)
:匹配零个或一个以上的模式,但不匹配单独一个的模式。
$ ls abc?(.)txt
abctxt abc.txt
上面例子中,?(.)
匹配零个或一个点。
$ ls abc?(def)
abc abcdef
上面例子中,?(def)
匹配零个或一个def
。
$ ls abc+(.txt|.php)
abc.php abc.txt
上面例子中,+(.txt|.php)
匹配文件有一个.txt
或.php
后缀名。
$ ls abc+(.txt)
abc.txt abc.txt.txt
上面例子中,+(.txt)
匹配文件有一个或多个.txt
后缀名。
量词语法也属于文件名扩展,如果不存在可匹配的文件,就会原样输出。
# 没有 abc 开头的文件名
$ ls abc?(def)
ls: 无法访问'abc?(def)': 没有那个文件或目录
上面例子中,由于没有可匹配的文件,abc?(def)
就原样输出,导致ls
命令报错。