Shell-編程基礎(chǔ)

1、Shell概述

(1)Shell說明:
  • Shell 就是命令解釋器,而shell Script 是利用 shell 所寫的一個程序
  • 簡單理解就是將多個指令匯集在一起,然后一次執(zhí)行
  • 查詢系統(tǒng)支持的 shell類型:
cd /etc/
cat shells
(2)ShellScript編寫建議
  • 指令和參數(shù)之間的多個空格會被忽略
  • 當(dāng)讀到回車符(enter)的時候嘗試執(zhí)行
  • 當(dāng)一行的內(nèi)容過長時可以使用跳脫字符(\enter)來分行
  • #是被用作注解(注釋),除 shell文件定義
  • 編寫的文檔里面加上文檔的用途,歷史修改,作者等信息
(3)建議在 Script 檔案中聲明的東西
  • 文檔的功能
  • 文檔的版本信息,作者及其聯(lián)系
  • 修改的歷史記錄
  • 內(nèi)部特殊的指令
  • 預(yù)設(shè)的環(huán)境變量

2、echo命令

man echo:

NAME
     echo -- write arguments to the standard output

SYNOPSIS
     echo [-n] [string ...]

DESCRIPTION
     The echo utility writes any specified operands, separated by single blank (` ') characters and followed by a newline (`\n') character, to the standard output.
     The following option is available:
     -n    Do not print the trailing newline character.  This may also be achieved by appending `\c' to the end of the string, as is done by iBCS2 compatible systems.  Note that this
           option as well as the effect of `\c' are implementation-defined in IEEE Std 1003.1-2001 (``POSIX.1'') as amended by Cor. 1-2002.  Applications aiming for maximum portabil-
           ity are strongly encouraged to use printf(1) to suppress the newline character.

     Some shells may provide a builtin echo command which is similar or identical to this utility.  Most notably, the builtin echo in sh(1) does not accept the -n option.  Consult the
     builtin(1) manual page.

EXIT STATUS
     The echo utility exits 0 on success, and >0 if an error occurs.

SEE ALSO
     builtin(1), csh(1), printf(1), sh(1)

轉(zhuǎn)義說明:

\a 發(fā)出警告聲;
\b 刪除前一個字符;
\c 最后不加上換行符號;
\f 換行但光標(biāo)仍舊停留在原來的位置;
\n 換行且光標(biāo)移至行首;
\r 光標(biāo)移至行首,但不換行;
\t 插入tab;
\v 與\f相同;
\\ 插入\字符;
\nnn 插入nnn(八進制)所代表的ASCII字符;

3.shell 腳本樣例開發(fā)

創(chuàng)建文件:

(1)創(chuàng)建Shell腳本文件
vim helloShell.sh
(2)定義bashbang
#!/bin/bash  
(3)腳本開發(fā)
echo hello shell 

執(zhí)行方式:

  • 賦予執(zhí)行權(quán)限,在相對/絕對路徑下進行執(zhí)行
chmod 755 helloShell.sh
./helloShell.sh
  • 通過 bash 進行調(diào)用
bash helloShell.sh

4、Bash基本功能

(1) history

說明:

  • history命令用于顯示指定數(shù)目的指令命令,讀取歷史命令文件中的目錄到歷史命令緩沖區(qū)和將歷史命令緩沖區(qū)中的目錄寫入命令文件。
  • 該命令單獨使用時,僅顯示歷史命令,在命令行中,可以使用符號!執(zhí)行指定序號的歷史命令。例如,要執(zhí)行第2個歷史命令,則輸入!2;
  • history more 是記錄 1000 個歷史命令,并且是在退出系統(tǒng)時進行記錄。具體的記錄位置為 用戶 home 目錄下 .bash_hostory 文件中。

語法:

history [選項] (參數(shù))
    -c:清空當(dāng)前歷史命令;
    -a:將歷史命令緩沖區(qū)中命令寫入歷史命令文件中;
    -r:將歷史命令文件中的命令讀入當(dāng)前歷史命令緩沖區(qū);
    -w:將當(dāng)前歷史命令緩沖區(qū)命令寫入歷史命令文件中。

樣例:

  • history: 默認查詢1000 條歷史命令。
  • history -a: 系統(tǒng)為 logout前,將緩沖區(qū)中的命令記錄寫入到.bash_history 中
(2) 命令和文件的補全
  • 使用 tab 鍵進行文件和命令的補全操作。
  • 輸入命令后,連續(xù)敲兩次 tab 會列出以該命令開頭的所有可用命令
(3) alias

說明:

  • alias命令用來設(shè)置指令的別名。我們可以使用該命令可以將一些較長的命令進行簡化。
  • 使用alias時,用戶必須使用單引號''將原來的命令引起來,防止特殊字符導(dǎo)致錯誤。
  • alias命令的作用只局限于該次登入的操作。若要每次登入都能夠使用這些命令別名,則可將相應(yīng)的alias命令存放到bash的初始化文件/etc/bashrc中。

語法:

alias [選項] (參數(shù))
[選項]:
 -p:打印已經(jīng)設(shè)置的命令別名。
[參數(shù)]:
格式為 命令別名=‘實際命令’   例如: alias  lt = 'ls -ltr' 

樣例:

  • 設(shè)置別名: alias lt = 'ls -ltr'
  • 查詢設(shè)置的別名: alias -p
(4)bash 快捷鍵
快捷鍵 作用
ctrl+c 強制結(jié)束當(dāng)前命令
Ctrl+A 把光標(biāo)移動到命令行開頭
ctrl+E 把光標(biāo)移動到明亮行結(jié)尾
Ctrl+L 清屏 相當(dāng)于 clear
ctrl+U 刪除或者剪切光標(biāo)之前的命令
ctrl+K 刪除或者剪切光標(biāo)之后的命令
ctrl+Y 粘貼 ctrl+u 或者 ctrl+K 之后的內(nèi)容
ctrl+R 在歷史命令中搜索
ctrl+Z 暫停,并放入后臺
ctrl+S 暫停屏幕輸出
Ctrl+Q 恢復(fù)屏幕輸出
(5)、輸入輸出重定向
1) Bash的標(biāo)準(zhǔn)輸入輸出
操作設(shè)備 設(shè)備文件名 文件描述符 類型
鍵盤 /dev/stdin 0 標(biāo)準(zhǔn)輸入
顯示器 / dev/stout 1 標(biāo)準(zhǔn)輸出
顯示器 /dev/sterr 2 標(biāo)準(zhǔn)錯處輸出
2) 輸出重定向
輸出重定向
3)輸入重定向

說明:

  • < 改變標(biāo)準(zhǔn)輸入路徑,使用文件作為數(shù)據(jù)源
  • << 改變標(biāo)準(zhǔn)輸入路徑,使用輸入作為數(shù)據(jù)源,需要一個結(jié)束符
wc [選項] [文件名]
 選項
    -c 統(tǒng)計字節(jié)數(shù)
    -w 統(tǒng)計單詞數(shù)
    -l 統(tǒng)計行數(shù)
(6)多命令順序執(zhí)行

說明:

執(zhí)行符 格式 作用
; cmdA ;cmdB ; cmdC 多個命令順序執(zhí)行,每個命令之間沒有聯(lián)系
&& cmdA && cmdB 當(dāng) cmdA 成功執(zhí)行結(jié)束后,執(zhí)行 cmdB;當(dāng) cmdA執(zhí)行異常是,不會執(zhí)行 cmdB
| cmdA || cmdB 當(dāng) cmdA 執(zhí)行異常時,cmdB才會執(zhí)行;當(dāng) cmdA執(zhí)行正常時,cmdB不會執(zhí)行

樣例:

單分支if:如果ls執(zhí)行成功輸出yes,執(zhí)行失敗輸出no  
ls && echo  yes || echo no  
(7)管道符
1)行提取命令 grep

說明:

grep [選項] "搜索內(nèi)容" 文件名
[選項]:
 -A 數(shù)字 列出符合條件的行,并列出后續(xù)的n行
 -B 數(shù)字 列出符合條件的行,并列出前面的n行
 -c 統(tǒng)計符合條件的字符串的次數(shù)
 -i 忽略大小寫
 -n 輸出行號
 -v 反向查找
 --color=auto 搜索出的關(guān)鍵字用顏色顯示

樣例:

  • grep ls .bash_history
  • grep -A 3 "ls" .bash_history
  • grep --color=auto -A 3 "ls" .bash_history
  • grep -c "ls" .bash_history
2)搜索命令 find

用途: 在指定目錄下查找文件
說明:

find path -option [-print] [-exec -ok |xargs |grep] [command {} \;]
path:要查找的目錄路徑
    ~ 表示$HOME目錄
    . 表示當(dāng)前目錄
    / 表示根目錄
-option:查找方式
   -name filename  #查找名為filename的文件
   -perm  #按執(zhí)行權(quán)限來查找
   -user username  #按文件屬主來查找
   -group groupname  #按組來查找
   -mtime  -n +n #按文件更改時間來查找,-n指n天以內(nèi),+n指n天以前
   -atime  -n +n #按文件訪問時間來查找文件,-n指n天以內(nèi),+n指n天以前
   -ctime  -n +n #按文件創(chuàng)建時間來查找文件,-n指n天以內(nèi),+n指n天以前
   -nogroup  #查無有效屬組的文件
   -nouser   #查無有效屬主的文件,即文件的屬主在/etc/passwd中不存
   -type    b/d/c/p/l/f     #查是塊設(shè)備、目錄、字符設(shè)備、管道、符號鏈接、普通文件
   -size n[c]  #查長度為n塊[或n字節(jié)]的文件
   -mount #查文件時不跨越文件系統(tǒng)mount點
   -follow  #如果遇到符號鏈接文件,就跟蹤鏈接所指的文件
   -prune   #忽略某個目錄
[-print] : 將結(jié)果作為標(biāo)準(zhǔn)輸出
[-exec]: 對匹配到的文件執(zhí)行shell命令
[-ok]: 對匹配到的文件執(zhí)行 Shell 命令,執(zhí)行之前會進行確認

樣例:

  • find . -name '*.txt' -print:當(dāng)前目錄查找txt結(jié)尾的文件
  • find . -path "./testDir" -prune -o -name "*.txt" -print : 在當(dāng)前目錄除testDir之外的子目錄內(nèi)搜索txt結(jié)尾的文件
  • find . -perm 755 -print: 在當(dāng)前目錄中查詢具有執(zhí)行權(quán)限的文件
  • find . -size -39k: 查找當(dāng)前目錄下,大小為 39K的文件
    執(zhí)行命令:
  • find . -name '*.txt' -exec echo "ok" {} ; :查找以txt結(jié)尾的文件,找到之后輸出ok;
  • find . -name 'test.txt' -ok cp {} {}.bak ; :備份test.txt
3)find 與 grep的區(qū)別
  • find是在系統(tǒng)當(dāng)中搜索符合條件的文件名,如果需要模糊查詢,使用通配符或者正則進行匹配。
  • grep命令是在文件中搜索符合條件的字符串,如果需要模糊查詢,則可使用正則進行匹配。
(8)通配符
通配符 說明 樣例
* 匹配0個或多個任意字符 a*b,a與b之間可以有任意長度的字符,也可以沒有。
? 匹配一個任意字符 a?b,a與b之間必須但也只能存在一個字符,該字符可以是任意字符
[] 匹配[]中的任意單個字符 a[xyz]b,a與b之間必須但也只能存在一個字符,該字符只能是x或y或z
[! ] 匹配除list中的任意單個字符 a[!a-z]b,a與b之間必須但也只能存在一個字符,該字符不能是小寫字母
[c1-c2] 匹配c1-c2間的任意單個字符 a[0-1]b,a與b之間必須但也只能存在一個字符,該字符只能是數(shù)字
{} 匹配{} 中的一個字符串 a{abc,xyz,opq}b,a與b之間必須但也只能存在一個字符串,字符串只能是abc或xyz或opq
(9)特殊字符
1) 說明
符號 作用
'' 單引號,被單引號包含的所有特殊字符都沒有特殊含義
"" 雙引號,在雙引號內(nèi)的特殊符號是沒有特殊含義的,但是$,`, \例外
`` 反引號,反引號括起來的就是系統(tǒng)命令
$() 引用系統(tǒng)命令
() 用于一串命令執(zhí)行時,回去子shell中執(zhí)行
{} 異常命令執(zhí)行時,{}中的命令會在當(dāng)前 Shell 中執(zhí)行
[] 用于變量測試
# 在 Shell 中,除BashBang 之外,其他情況下均代表注釋
$ 用于調(diào)用變量的值
\ 轉(zhuǎn)義符
2)$()和 ` `(反引號)
  • bash shell 中,$( ) 與 (反引號) 都可用做命令替換用。
  • `` 基本上可用在全部的 unix shell 中使用,若寫成 shell script ,其移植性比較高,但反單引號容易打錯或看錯
  • 在部分編輯器中反引號與單引號相似,容易出現(xiàn)混淆,建議使用${}進行系統(tǒng)命令引用

【參考文檔】:

man.linuxde

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容