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+箭頭:向左或向右移動一個字
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章