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+箭頭:向左或向右移動一個字