bash的基础特性:
bash,Unix shell的一种,在1987年由布莱恩・福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。它也被移植到MicrosoftWindows上的Cygwin与MinGW,或是可以在MS-DOS上使用的DJGPP项目。在Novell NetWare与Andriod在上也有移植。1990年后,Chet Ramey成为了主要的维护者。
为Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourne shell(sh)的一个双关语(Bourne again /born again):Bourne-AgainSHell。
Shell
GUI:
GNOME
KDE
XFCE
CLI:
狭义上的shell
cat/etc/shells
/bin/bash
/bin/csh
/bintcsh
/bin/bash
终端:ternimal
(1) 命令历史
history
(2) 命令别名
alias/unalias
(3) 命令补全
(4) 路径补全
(5) 命令行展开
~, {}
常用的基础命令:
cd命令:change directory
cd [/PATH/TO/SOMEWHERE]
cd
cd ~: 回主目录
cd ~USERNAME:切换指定用户的家目录
cd -: 回到上一次所在目录
相关环境变量:
PWD:
OLDPWD:
pwd命令:printing workingdirectory
显示工作目录
ls:list
列出指定路径下的文件或目录的属性信息
Metadata:属性数据
data:数据
ls [OPTION]... [FILE]...
-l: 使用长格式显示
drwxr-xr-x1 root root 8 Aug 23 08:47 .cache
d:文件类型
rwxr-xr-x:权限,mode
1:文件被硬链接的次数
root:owner,属主;
root:group, 属组
8:size,默认为字节
Aug23 08:47 修改时间戳
.cache:文件名
-d:显示目录自身属性
-h:human-readable
-a:显示所有文件,包括.开头的隐藏文件
.:当前目录
..:父目录
-r: reverse,逆序显示
-R: recusive,递归
文本文件查看类的命令:
cat, tac命令:
cat[OPTION]... [FILE]...
-n:
-e:-vE
-E:显示行结束符
-v:显示非打印字符
文件内容类型查看命令:
file /PATH/TO/SOMEWHERE
回显命令: echo
echo [OPTION]...[ARGS]...
-n: 不进行换行;
-e:让控制符生效;
\n:new line
echo"$VAR_NAME"
命令路径位置查看工具:
whereis, which
which:
which[options] [--] programname [...]
--skip-alias:禁止列出别名
whereis COMMAND:
显示二进制程序、源码文件以及帮助手册的路径;
时间相关的命令:
RTC:RealTime Clock
System Clock:系统时钟
date: 系统时间
clock, hwclock: 硬件时间
date:
date[OPTION]... [+FORMAT]:时间显示
FORMAT
%F
%D
%T
%H
%M
%S
date[MMDDhhmm[[CC]YY][.ss]]:时间设置
hwclock
-s:hctosys, 以硬件时钟为准,调整系统时间同硬件;
-w:systohc, 以系统时钟为准
cal:
cal[YEAR]
关机或重启
关机:halt, poweroff,init 0, shutdown -h TIME
重启:reboot, init 6,shutdown -r TIME
shutdown
shutdown[OPTIONS...] [TIME] [WALL...]
-r:重启
-h:关机
--no-wall
-c
TIME:
+m:相对时长之后执行相应操作;单位是分钟;
HH:MM绝对时间
stat:
w,who, whoami
bash的基础特性(02)
(1) glob
文本名“通配”
*:匹配任意长度的任意字符;
?:匹配任意单个字符;
a*b:aab, ab, a123b;
a?b:
[]: 匹配指定范围内的任意单个字符;
[0-9]
[^]:匹配范围外的任意单个字符;
[^a-b]
字符集合:
[:lower:]
[:upper:]
[:alnum:]
[:digit:]
[:space:]
[:punct:]
[:alnum:]
练习:
显示/etc/目录下,以非字母开头,后面跟了一具字母及其它任意长度任意字符的文件或目录;
复制/etc目录下,所有以.d结尾的文件或目录至/tmp/mageedu.com目录中;
(2) 组合键
Ctrl+l:清屏
Ctrl+a: 切换至命令行首
Ctrl+e:切换至命令行尾
Ctrl+c:取消命令执行
Ctrl+u:删除光标所在处至行首的内容;
Ctrl+k: 删除光标所在处至行尾的内容;
(3) IO重定向和管道
程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都一个fd:file descriptor
标准输入:keyboard, 0,/dev/stdin
标准输出:monitor, 1,/dev/stdout
标准错误输出:monitor, 2,/dev/stderr
I/O重定向:
输入重定向
输出重定向:
COMMAND> NEW_POS, COMMAND >> NEW_POS
>:覆盖重定向;
>>:追加重定向;
set-C
如果覆盖重定向目标文件存在,则禁止执行;
>|
set+C
错误重定向:
2>:覆盖
2>>:追加
同时重定向标准输出流和错误输出流:
COMMAND >/path/to/file.out 2> /path/to/file.err
COMMAND >/path/to/file.out 2>&1
COMMAND&> /path/to/file.out
输入重定向:
<
tr命令:
tr[OPTION]... SET1 [SET2]
-d:删除字符
Here Document:<<
cat >>/path/to/somefile << EOF
管道:
COMMAND1 | COMMAND2 | ...
练习:tee命令的用法;
使用整数[编辑]
与Bourne shell不同的是bash不用另外生成进程即能进行整数运算。bash使用((...))命令和$[...]变量语法来达到这个目的:
VAR=55 # 将整数55赋值给变量VAR
((VAR = VAR + 1)) # 变量VAR加1。注意这里没有'$'
((++VAR)) # 另一种方法给VAR加1。使用C语言风格的前缀自增
((VAR++)) # 另一种方法给VAR加1。使用C语言风格的后缀自增
echo $((VAR * 22)) # VAR乘以22并将结果送入命令
echo $[VAR * 22] # 同上,但为过时用法
((...))命令可以用于条件语句,因为它的退出状态是0或者非0(大多数情况下是1),可以用于是与非的条件判断:
if((VAR == Y * 3 + X * 2))
then
echo Yes
fi
((Z > 23)) && echo Yes
((...))命令支持下列比较操作符:'==', '!=','>', '<', '>=',和'<='。
bash不能在自身进程内进行浮点数运算。当前有这个能力的unix shell只有Korn shell和Z shell。
输入输出重定向[编辑]
bash拥有传统Bourne shell缺乏的I/O重定向语法。bash可以同时重定向标准输出和标准错误,这需要使用下面的语法:
command &> file
这比等价的Bourne shell语法"command> file 2>&1"来的简单。2.05b版本以后,bash可以用下列语法重定向标准输入至字符串(称为here string):
command <<< "string to be readas standard input"
如果字符串包括空格就需要用引号包裹字符串。
例子: 重定向标准输出至文件,写数据,关闭文件,重置标准输出。
# 生成标准输出(文件描述符1)的拷贝文件描述符6
exec 6>&1
# 打开文件"test.data"以供写入
exec 1>test.data
# 产生一些内容
echo "data:data:data"
# 关闭文件"test.data"
exec 1>&-
# 使标准输出指向FD 6(重置标准输出)
exec 1>&6
# 关闭FD6
exec 6>&-
打开及关闭文件
# 打开文件test.data以供读取
exec 6<test.data
# 读文件直到文件尾
while read -u 6 dta
do
echo "$dta"
done
# 关闭文件test.data
exec 6<&-
抓取外部命令的输出
# 运行'find'并且将结果存于VAR
# 搜索以"h"结尾的文件名
VAR=$(find . -name "*h")
进程内的正则表达式[编辑]
bash3.0支持进程内的正则表达式,使用下面的语法:
[[ string =~ regex ]]
正则表达式语法同regex(7) man page所描述的一致。正则表达式匹配字符串时上述命令的退出状态为0,不匹配为1。正则表达式中用圆括号括起的子表达式可以访问shell变量BASH_REMATCH,如下:
if [[ abcfoobarbletch =~ 'foo(bar)bl(.*)' ]]
then
echo The regex matches!
echo $BASH_REMATCH -- outputs: foobarbletch
echo ${BASH_REMATCH[1]} -- outputs:bar
echo ${BASH_REMATCH[2]} -- outputs:etch
fi