shell的工作原理
其实当一个用户以命令行方式登录linux或UNIX操作系统之后即进入了Shell应用程序,例如
[dag@dog ~]$ 就是shell的提示符。
shell的功能是将用户输入的命令翻译成linux内核(Kernel)能够理解的语言,这样linux的内核才能真正的操作计算机的硬件,shell就是人与计算机沟通的桥梁
shell为用户与Kernel之间的一个接口
shell主要是一个命令解释器
它接受并解释用户输入的命令,然后将这些命令传给内核。最后由内核来执行这些命令
bash的成长历程
-
Bourn shell是现在所有shell的始祖
-
C shell增加了若干Bourn shell没有的特性,如命令行历史、别名和作业控制等
-
Korn shell是Bourn shell的超集,它具有类似C shell的加强功能
-
bash与Bourn shell兼容同时加入了csh、ksh和tcsh的一些有用的功能、由GNU项目开发、也是实际上的标准Linux shell
-
系统中所有shell都存放在/etc/shells文件中
[dag@dog ~]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
[dag@dog ~]$ whami
bash: whami: command not found
[dag@dog ~]$ whoami
dag
[dag@dog ~]$ tail -4 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
dag:x:500:500:dad dog:/home/dag:/bin/bash
cat:x:501:501::/home/cat:/bin/bash
fox:x:502:502::/home/fox:/bin/bash
[dag@dog ~]$ sh
sh-4.1$ ok
sh: ok: command not found
sh-4.1$ ksh
sh: ksh: command not found
sh-4.1$ oh
sh: oh: command not found
sh-4.1$ bash
[dag@dog ~]$ oo
bash: oo: command not found
[dag@dog ~]$
使用type识别bash的内置命令
Linux操作系统的明来那个分为两大类,一类是内部命令即内置在bash中的命令,另一类是外部命令(即该命令不是内置在bash中的)
外部命令是以可执行文件的方式存储在Linux的文件系统中的。
type [选项] 命令名
- -a ~ 列出所有包含指定命令名的命令、也包括别名(alias)
- -P ~显示完整的文件名(外部命令),或者为内部命令
- -t ~显示文件的类型,其文件类型如下:
- file:为外部命令
- alias:为别名
builtin:为bash的内置命令
[dag@dog ~]$ man type
[dag@dog ~]$ type pwd
pwd is a shell builtin
[dag@dog ~]$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
[dag@dog ~]$ type -t pwd
builtin
[dag@dog ~]$ type -p pwd
[dag@dog ~]$ type -P pwd
/bin/pwd
[dag@dog ~]$ ls -l /bin/pwd
-rwxr-xr-x. 1 root root 28008 5月 2 2018 /bin/pwd
[dag@dog ~]$ file /bin/pwd
/bin/pwd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[dag@dog ~]$ type -P ls
/bin/ls
[dag@dog ~]$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
[dag@dog ~]$ which pwd
/bin/pwd
[dag@dog ~]$ whatis pwd
pwd (1p) - return working directory name
pwd (1) - print name of current/working directory
pwd [builtins] (1) - bash built-in commands, see bash(1)
pwd.h [pwd] (0p) - password structure
[dag@dog ~]$ which ls
alias ls='ls --color=auto'
/bin/ls
[dag@dog ~]$ whhatis ls
bash: whhatis: command not found
[dag@dog ~]$ whatis ls
ls (1) - list directory contents
ls (1p) - list directory contents
[dag@dog ~]$ type -t whoami
file
[dag@dog ~]$ type whoami
whoami is /usr/bin/whoami
利用通配符操作文件
- 通配符也称元字符是描述其他数据的字符
- Linux操作系统提供的主要通配符如下:
- *:将匹配0个(即空白)或多个字符
- ?:将匹配任何一个字符而且只能是一个字符
- [a-z]:将匹配字符a~z范围内的所有字符
- [^a-z]:将匹配所有字符但是a~z范围内的字符除外
- [xyz]:将匹配方括号中的任意一个字符
- [^xyz]:将匹配不包括方括号中的字符的所有字符
[dag@dog ~]$ mkdir wolf
[dag@dog ~]$ cd wolf
[dag@dog wolf]$ touch dog1.wolf dog2.wolf dog3.wolf dog11.wolf dog21.wolf
[dag@dog wolf]$ touch dog.wolf.girl dog.wolf.boy dog.wolf.baby
[dag@dog wolf]$ ls -F
dog11.wolf dog21.wolf dog3.wolf dog.wolf.boy
dog1.wolf dog2.wolf dog.wolf.baby dog.wolf.girl
[dag@dog wolf]$ ls *.wolf
dog11.wolf dog1.wolf dog21.wolf dog2.wolf dog3.wolf
[dag@dog wolf]$ ls *.wolf.*
dog.wolf.baby dog.wolf.boy dog.wolf.girl
[dag@dog wolf]$ ls dog?.wolf
dog1.wolf dog2.wolf dog3.wolf
[dag@dog wolf]$ ls dog??.wolf
dog11.wolf dog21.wolf
[dag@dog wolf]$ touch dog1.wolf.girl dog3.wolf.boy
[dag@dog wolf]$ ls -F
dog11.wolf dog1.wolf.girl dog2.wolf dog3.wolf.boy dog.wolf.boy
dog1.wolf dog21.wolf dog3.wolf dog.wolf.baby dog.wolf.girl
[dag@dog wolf]$ ls dog[1-2].*
dog1.wolf dog1.wolf.girl dog2.wolf
[dag@dog wolf]$ ls dog[^1-2].*
dog3.wolf dog3.wolf.boy
[dag@dog wolf]$ ls dog[13].*
dog1.wolf dog1.wolf.girl dog3.wolf dog3.wolf.boy
[dag@dog wolf]$ ls dog[^13].*
dog2.wolf
[dag@dog wolf]$ rm dog??.*
[dag@dog wolf]$ ls
dog1.wolf dog2.wolf dog3.wolf.boy dog.wolf.boy
dog1.wolf.girl dog3.wolf dog.wolf.baby dog.wolf.girl
利用Tab键补齐命令行
- 当在键盘上按Tab键时
- 如果光标在命令上,将补齐一个命令名
- 如果光标在参数上,将补齐一个文件名
- 如在bash提示符下输入whoa,而此时光标在a之后,当按Tab键之后系统会自动补齐该命令剩余的字符——whoami
- 如在bash提示符下输入file dog,连续按两次Tab键就会显示所有以dog开头的文件名
命令行中~的使用
- ~符号的含义如下:
- 如果~符号后面没有用户名,则该符号代表当前用户的家目录
- 如果~符号后面跟一个用户名,则该符号代表这个用户的家目录
[dag@dog ~]$ cd boydog
[dag@dog boydog]$ pwd
/home/dag/boydog
#显示dag家目录下的wolf子目录中所有的内容
[dag@dog boydog]$ ls ~/wolf
dog1.wolf dog2.wolf dog3.wolf.boy dog.wolf.boy
dog1.wolf.girl dog3.wolf dog.wolf.baby dog.wolf.girl
[dag@dog boydog]$ ls ~cat/dog
ls: 无法访问/home/cat/dog: 权限不够
[dag@dog boydog]$ su root
密码:
[root@dog ~]# ls -F ~cat/dag
cal2012 cal3009 公共的/ 视频/ 文档/ 音乐/
cal2038 lists 模板/ 图片/ 下载/ 桌面/
#显示dag家目录下的wolf子目录中所有的内容
[root@dog ~]# ls -F ~dag/wolf
dog1.wolf dog2.wolf dog3.wolf.boy dog.wolf.boy
dog1.wolf.girl dog3.wolf dog.wolf.baby dog.wolf.girl
[root@dog ~]# exit
exit
[dag@dog boydog]$ cd ~/wolf
history命令与操作曾经使用过的命令
绝大多数shell命令都会保留最近输入的命令的历史。这一机制可以使用户能够浏览、修改或重新执行之前使用过得命令。
使用history命令将列出用户最近输入的命令(也包括错误命令)
- history命令显示结果的最左边是命令编号、可以使用命令号重新执行所对应的命令
bash变量简介及大括号{}的用法
- shell变量是内存中一个命了名的临时存储区
- shell变量中所存储的信息有以下两种:
- 按用户的习惯定制shell所需的信息
- 使一些进程正常工作所需的信息
- Linux系统预定义了一些系统常用的变量
- 这些变量用户可以直接使用,如PATH变量
[dag@dog ~]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dag/bin
[dag@dog ~]$ echo $HOME
/home/dag
[dag@dog ~]$ cd wolf
[dag@dog wolf]$ pwd
/home/dag/wolf
[dag@dog wolf]$ cd $HOME
[dag@dog ~]$ pwd
/home/dag
[dag@dog ~]$ mkdir mumdog
[dag@dog ~]$ cd mumdog
[dag@dog mumdog]$ touch {dog,wolf}
[dag@dog mumdog]$ ls
dog wolf
[dag@dog mumdog]$ ls -ls
总用量 0
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:35 dog
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:35 wolf
[dag@dog mumdog]$ touch baby.{dog,wolf}
[dag@dog mumdog]$ ls
baby.dog baby.wolf dog wolf
[dag@dog mumdog]$ ls -ls
总用量 0
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:36 baby.dog
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:36 baby.wolf
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:35 dog
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:35 wolf
[dag@dog mumdog]$ touch {girl,boy}.{dog,wolf}
[dag@dog mumdog]$ ls -ls
总用量 0
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:36 baby.dog
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:36 baby.wolf
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:37 boy.dog
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:37 boy.wolf
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:35 dog
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:37 girl.dog
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:37 girl.wolf
0 -rw-rw-r--. 1 dag dag 0 5月 16 23:35 wolf
[dag@dog mumdog]$ rm baby.{dog,wolf}
[dag@dog mumdog]$ ls -l
总用量 0
-rw-rw-r--. 1 dag dag 0 5月 16 23:37 boy.dog
-rw-rw-r--. 1 dag dag 0 5月 16 23:37 boy.wolf
-rw-rw-r--. 1 dag dag 0 5月 16 23:35 dog
-rw-rw-r--. 1 dag dag 0 5月 16 23:37 girl.dog
-rw-rw-r--. 1 dag dag 0 5月 16 23:37 girl.wolf
-rw-rw-r--. 1 dag dag 0 5月 16 23:35 wolf
将一个命令的输出作为另一个命令的参数
因为UNIX的原则是每一个命令都简单而且只完成单一的功能,因此想要完成比较复杂的工作时,可能就需要将一些命令组合在一起。
[dag@dog mumdog]$ hostname
dog.super.com
[dag@dog mumdog]$ cd~
bash: cd~: command not found
[dag@dog mumdog]$ cd
[dag@dog ~]$ hostname
dog.super.com
[dag@dog ~]$ echo "This computer system's name is hostname"
This computer system's name is hostname
[dag@dog ~]$ echo "This computer system's name is `hostname`"
This computer system's name is dog.super.com
[dag@dog ~]$ echo "This computer system's name is $(hostname)"
This computer system's name is dog.super.com
[dag@dog ~]$ echo "Today is `date`"
Today is 2020年 05月 16日 星期六 23:48:46 EDT
[dag@dog ~]$ echo "Today is $(date)"
Today is 2020年 05月 16日 星期六 23:49:11 EDT
使用Linux命令进行数学运算
[dag@dog ~]$ echo year1
year1
[dag@dog ~]$ year1=1;
[dag@dog ~]$ echo $year1
1
[dag@dog ~]$ year2=2;year3=3;year4=4;year5=5;
[dag@dog ~]$ echo $year3
3
[dag@dog ~]$ n1=99;n2=53;n3=56;n4=63;n5=2;
[dag@dog ~]$ echo $2
[dag@dog ~]$ echo $n2
53
[dag@dog ~]$ echo $[$n1 + $n2]
152
[dag@dog ~]$ echo $[$year2 * $n2]
106
[dag@dog ~]$ echo $[$year1 / $n5]
0
[dag@dog ~]$ echo $[$n1 / $n5]
49
[dag@dog ~]$ echo $[$n1 % $n5]
1
[dag@dog ~]$ N=8
[dag@dog ~]$ echo $[$year4**$N]
65536
命令行中反斜线(\)的用法
- 反斜线\也叫做逃逸符号、即\之后的特殊字符逃脱其特殊含义而恢复原来的字面意思
- 如果将反斜线放在命令行的最后,就表示它是一个续行符号,即命令要在下一行继续。
[dag@dog wolf]$ echo "A baby dog's price is $6839.00"
A baby dog's price is 839.00
[dag@dog wolf]$ echo "A baby dog's price is \$6839.00"
A baby dog's price is $6839.00
[dag@dog wolf]$ ls -\
> 1 *.wolf.*
dog1.wolf.girl
dog3.wolf.boy
dog.wolf.baby
dog.wolf.boy
dog.wolf.girl
[dag@dog wolf]$ echo *** We only sell baby dogs ***
dog1.wolf dog1.wolf.girl dog2.wolf dog3.wolf dog3.wolf.boy dog.wolf.baby dog.wolf.boy dog.wolf.girl We only sell baby dogs dog1.wolf dog1.wolf.girl dog2.wolf dog3.wolf dog3.wolf.boy dog.wolf.baby dog.wolf.boy dog.wolf.girl
[dag@dog wolf]$ echo \*\*\* We only sell baby dogs \*\*\*
*** We only sell baby dogs ***
[dag@dog wolf]$ echo \*** We only sell baby dogs \***
*** We only sell baby dogs ***
linux命令中引号的用法
[dag@dog wolf]$ echo '*** We only sell baby dogs ***'
*** We only sell baby dogs ***
[dag@dog wolf]$ echo "*** We only sell baby dogs ***"
*** We only sell baby dogs ***
[dag@dog wolf]$ price=6839.00
[dag@dog wolf]$ echo "$price"
6839.00
[dag@dog wolf]$ echo 'price'
price
[dag@dog wolf]$ echo '$price'
$price
[dag@dog wolf]$ echo Today is 'date'
Today is date
[dag@dog wolf]$ echo Today is 'date'
Today is date
[dag@dog wolf]$ echo Today is `date`
Today is 2020年 05月 17日 星期日 00:11:59 EDT
[dag@dog wolf]$ "echo Today is `date`"
bash: echo Today is 2020年 05月 17日 星期日 00:14:25 EDT: command not found
[dag@dog wolf]$ echo "Today is `date`"
Today is 2020年 05月 17日 星期日 00:15:55 EDT
[dag@dog wolf]$ echo 'Today is `date`'
Today is `date`
[dag@dog wolf]$ echo \$MALL
$MALL
[dag@dog wolf]$ echo "\$MALL"
$MALL
[dag@dog wolf]$ echo '\$MALL'
\$MALL
[dag@dog wolf]$ echo $MALL
[dag@dog ~]$ echo !305
echo echo $n2
echo 53
[dag@dog ~]$ echo echo "$n2"
echo 53
[dag@dog ~]$ echo echo "!305"
echo echo "echo $n2"
echo echo 53
[dag@dog ~]$ echo '!305'
!305
gnome终端的一些快捷键操作
- Ctrl+A:将光标移到命令行的开始处
- Ctrl+E:将光标移到命令行的结尾处
- Ctrl+U:删除到命令行开始处的所有内容
- Ctrl+K:删除到命令行结尾处的所有内容
- Ctrl+箭头:向左或向右移动一个字