Bash Shell 简介

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开头的文件名

命令行中~的使用

  • ~符号的含义如下:
    1. 如果~符号后面没有用户名,则该符号代表当前用户的家目录
    2. 如果~符号后面跟一个用户名,则该符号代表这个用户的家目录
[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+箭头:向左或向右移动一个字
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章