1、回顧基礎命令
2、腳本
3、變量
4、別名
5、條件判斷
6、test判斷
?
一、回顧基礎命令
shutdown –關機/重啟
exit –退出當前shell
rmdir –刪除空目錄
du –查看目錄占用的存儲空間
df –查看已 經掛載的文件系統的空間使用情況
ln –創建鏈接
cat –顯示文件的所有內容
head –顯示文件的頭部
tail –顯示文件的尾部
less –分屏/分頁 顯示文件內容
dirname –取出目錄
basename –取出文件名
history –歷史命令
1、ln
# ln -s [目標] [源 — 創建軟鏈接 (symbolic link)
# ln [目標] [源] — 創建硬鏈接
2、cat
concatinate,把文件的內容按順序連接起來,輸出到標準輸出。目前,只需要簡單理解成顯示文件的內容即可
# cat f1 — 顯示文件 f1 的內容到屏幕上
# cat -n f1 — 顯示文件的內容,并且加上行號
# cat -A f1 — 打印出一些不可見的字符和位置標記
3、head
讀取文件的頭部
# head -n 3 /etc/passwd –讀取文件前面三行
# head -n -3 /etc/passwd –讀取文件時,丟掉文件的后三行;
# head -c 3 /etc/passwd –讀取文件的前面三個字節
# head -c 10m /dev/zero > f1 –創建一個10M的文件
4、tail
讀取文件的尾部
# tail -n 3 /etc/passwd — 讀取文件的后面三行
# tail -c 3 /etc/passwd — 讀取文件的后面三個字節
# tail -n +28 /etc/passwd — 讀取文件中從第28行開始直到結尾的所有行
# tail -f /etc/passwd — 跟蹤文件尾部內容的變化,常用觀察日志文件的變化
5、history
# set -o history –啟用命令歷史功能 ,默認記錄在文件 ~/.bash_history 中
# set +o history –關閉命令歷史功能
# history –顯示最近n條歷史命令
注:以下三個變量用于控制命令歷史的數量,以及是否記錄時間戳
# vim /etc/bashrc –一般配置在該文件當中,用戶級可配置在 ~/.bashrc
HISTSIZE=1000000 –最多存儲多少條記錄
HISTFILESIZE=2000000 –命令歷史文件的最大尺寸
HISTTIMEFORMAT='[%Y-%m-%d %H:%M:%S] ‘ –命令歷史的時間戳格式
export HISTSIZE HISTFILESIZE HISTTIMEFORMAT –把他們定義成環境變量
?
二、腳本
1、如何執行腳本
?# vim test.sh
#!/bin/bash
echo ‘hello world’
# bash test.sh
# bash -x test.sh –顯示腳本執行過程的信息
# sh test.sh
# source test.sh
# . test.sh
–上述兼為非標準執行腳本,腳本文件可以沒有可執行權限;下列為標準執行:
# head -n 1 test.sh
#!/bin/bash
# chmod a+x test.sh
# ./test.sh
可直接將腳本放到 PATH 路徑下,直接當命令運行
注意:shell 必須以 #! 開頭,讀作sha-bang,這兩個字符用來標識文件類型,#! 用來告訴系統,這個文件里的內容將要用指定的解釋器來解釋,#! 之后的字符串將會被解釋成一個程序,該程序用來解釋當前文件。如果沒有提供sha-bang這一行,當前 shell 將會自主猜測一個,但結果并不保證和預期一致;所以最好明確指定。./test.sh 的運行流程:
1、內核讀取該腳本,檢查文件類型標記,獲取解釋氣得路徑;
2、內核運行解釋器;
3、解釋器運行起來后,就打開腳本文件,解釋其執行
linux 自帶的諸多解釋器:#!/bin/bash;#!/bin/sh;#!/usr/bin/perl;#!/bin/sed;#!/bin/awk
2、四則運算符
+ – * /
$(()) $[] expr let
# echo $((38%5)) –取余
# echo $[38/5] –求商
# echo $((10**2)) –10的平方
2.1、expr
# expr 14 % 9 –取余
# expr 34 / 9 –求商
# expr 30 * 3 –使用乘號時,必須用反斜線屏蔽其特定含義
# expr index “sarasara” a –抓取第一個字符數字串出現的位置
# expr substr “this is a test” 3 5 –抓取字串
# expr length “this is a test” –計算字串長度
2.2、let
let計算工具用于執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量。如果表達式中包含了空格或其他特殊字符,則必須引起來
# no=20
# let no++ –自增
# let no– –自減
# let no+=10 –自增10
# let no=no+10 –同上
# let no-=15 –自減15
# let a=5+4 –變了a無須加 $ 符號
# echo $a
3、shell配置文件
/etc/profile –全局配置文件,
/etc/bashrc –全局配置文件,一般用來定義環境變了
~/.bash_profile –用戶配置文件
~/.bashrc –用戶配置文件
~/.bash_logout –用戶配置文件,login shell 退出時會讀取該文件
4、shell種類
根據shell 的啟動方式不同,可以大致地把shell分為以下幾種:
login shell –在文本界面登錄,如su -;讀取shell配置文件順序如下:
/etc/profile——~/.bash_profile——~/.bashrc——/etc/bashrc
interactive shell –gnome-terminal 中默認的shell;讀取shell配置文件順序如下:
~/.bashrc —— /etc/bashrc
non-interactive shell –用來運行腳本的shell
?
4.1、在~/.bashrc 中設置一個變量 v,要求該變量只出現在交互shell中
# vim ~/.bash_profile –標識shell 是否登錄shell
LOGINSHELL=1
# vim ~/.bashrc –不是登錄shell 時,才設置變量
if [ “$LOGINSHELL” != 1 ];then
v=”interactive shell only”
fi
5、命令優先級
別名 > 函數 > 內部命令 > 外部命令
6、shell特殊字符
對于shell來說,有些字符除了它本身的意義之外,還有特殊的意義,如果要在字符串中包含特殊字符,就必須通過引用(quoting)的方法來去除特殊字符的特殊意義。以下列出的是部分特殊字符:
~ –不被引用的話將會被shell 替換成家目錄
& –把程序放到后臺執行
$ –dollar 符,可用于參數展開
${} –變量處理,可對變量的內容做替換,刪除,抽取等操作
* –星號,通配符,匹配所有字符
? –問號,通配符,匹配任意一個字符
() –命令組
{} –命令組
“” –雙引號,引用符號;可以去除大多數特殊字符的特殊意義,除 $;`;!; 外
” –單引號,引用符號;可以去除所有特殊字符的特殊意義,除自己本身
. –相當于source命令;可用于設置隱藏文件;用于目錄名時,代表當前目錄
/ –斜杠,路徑分隔符,根目錄
–反斜杠,可用來去除單個字符的特殊意義,也就是所謂的“轉義“,也可用于表示特殊字符,如換行符 (n)
“ –反撇號,命令優先執行,和$()含義是一樣的;如果有嵌套那么不能用“號
$(())和 $[] –運算符
: –空命令
; –命令分割;不去考慮上一條命令所執行的結果
;; –case 選項的結束符
# –注釋
&& –邏輯與;可對命令進行分割;但是需要考慮上一條命令所執行的結果
|| –邏輯或;可對命令進行分割;不需要考慮上一條命令執行結果
—————————————————————-
# echo ‘hello world;’ “hello world;” hello world; –用三種引用符合去除空格的特殊意義
?
三、變量
1、本地變量
當前用戶自定義的變量;當前進程有效,其他進程或者當前進程的子進程無效
# a=123
# echo $a
# unset a –取消變了定義
2、環境變量
當前進程有效,并且能被子進程調用;
# env –查看當前系統所有環境變量
# set –查看當前系統所有環境變量和臨時變量
# echo $PATH — 顯示PATH變量的內容
# export hi=hello –定義環境變量;工作當中一般喜歡把即用的環境變了寫在 ~/.bash_profile
幾個常見環境變量:
PATH –影響命令的搜索
PS1 –命令提示符
TMOUT –超時時間,單位為S,時間一到,自動退出 interactive shell ;所以最好將其設為只讀變量 # declare -r TMOUT=60
HISTSIZE, HISTFILESIZE, HISTTIMEFORMAT –命令歷史
?
3、系統變量
又叫bash中內置的變量;shell本身已經固定好的一些變量
$# –腳本后面接參數個數
$* –腳本后面所有的參數(被雙引號包含則被當成一個字符串輸出)
$@ –腳本后面所有的參數(被雙引號包含還是保留各參數的邊界)
$? –上一條命令執行后返回的狀態
$$ –當前進程的進程號
$! –后臺運行的最后一個進程號
!$ –最后一條命令或參數
!! –最后一條命令的歷史記錄
$0 –當前程序的程序名或進程
$1~$n –位置參數變量
#!/bin/bash
echo “$0 = $0”
echo “$# = $#”
echo “$* = $*”
echo “$1 = $2”
echo “$7 = $7”
echo “$11 = ${11}”
# chmod a+x test.sh
# ./test.sh a b c
4、變量定義
a、默認下,變量類型沒啥要求??梢越o變量賦任何值,但是等號兩邊不能有任何的空格
b、變量名區分大小寫
c、變量名不能以數字或者特殊符號開頭
d、將命令所執行的結果保存到變量
5、調用變量
# a=$(hostname)
# A=123456789
# echo $A
# echo ${A:2:3}
6、數組
數組的定義:用小括號擴起來定義數組,括號里的元素用空格隔開
# array[0]=var1
# array[1]=var2
# array[2]=var3
# array=(var1 var2 var3) –等同于上述三行,定義數組
# echo ${array[0]} –取數組第一個值
# echo ${array[*]} –取數組所有值
# echo ${array[@]} –同上
7、declare 定義有類型的變量
-i –將變量看成整數
-r –定義只讀變量
-x –將變量導出到環境變量
-a –將變量看成數組
8、read 交互式定義變量
-p –提示信息
-n –字符數
-t –超時
-s –不顯示
?
四、別名
命令的別名,顧名思義,就是可以通過別的名字來執行命令。通常用于簡化命令的輸入,或者為命令增加一些參數,或者是單純地為命令添加多個訪問名稱。
# alias cp mv rm –查看cp, mv, rm這三個命令是不是別名
# unalias rm — 刪除別名 rm
# alias cdyum=’cd /data/yum’ — 簡化輸入
# alias rm=’rm -i’ — 為命令增加參數
— 通常別名是在配置文件~/.bashrc 中設置的
1、驗證別名、函數、內部命令、外部命令的優先級別
# alias pwd=’echo it is an alias’ –創建一個 pwd 別名
# function pwd() { echo “this is a function”; } –創建一個 pwd 函數
# pwd –運行pwd,發現輸出是別名
# unalias pwd –刪除別名,再運行 pwd,發現輸出是函數內容
# unset pwd –刪除函數,再運行 pwd,才是輸出當前所在路徑
所以:別名 > 函數 > 內部命令 > 外部命令
?
五、條件判斷
# vim test
———————-
if [ 條件 ];then
command…
fi
———————-
if [ 條件 ];then
command…
else
command…
fi
———————-
if [ 條件1 ];then
command1…
elif [ 條件2 ];then
command2…
else
command3…
fi
———————-
if [ 條件1 ];then
command1…
if [ 條件2 ];then
command2…
fi
else
if [ 條件3 ];then
command3…
elif [ 條件4 ];then
command4…
else
command5…
fi
fi
?
六、test判斷
test == [ judge ]
1、文件存在與否的判斷
# vim test.sh
#!/bin/bash
if test -e $1;then –是否存在;還有 -p;-c;-b;-L
if [ -f $1 ];then –使用 [ judge ] 替換
if test -f $1;then –是否存在并且為普通文件
if test -d $1;then –是否存在并且為目錄
if test -S $1;then –是否存在并且套接字文件
echo ‘YES’
fi
# chmod a+x test.sh
# ./test.sh [path]
2、文件權限相關判斷
-r;-w;-x –是否有讀,寫,執行權限
-u –是否有suid
-g –是否有sgid
-k –是否有t位
-s –是否為空白文件,-s表示非空;! -s 空文件
3、字符串判斷
= –等于則為真,等于號兩邊必須有空格;也可以是:==
!= –不相等則為真
-z 字符串 –字符串的長度為零則為真
-n 字符串 –字符串的長度不為零則為真
if test $num1 = $num2;then
if [ $num1 = $num2 ];then
if [ -n $num1 ];then
4、數值判斷
-eq –等于則為真
-ne –不等于則為真
-gt –大于則為真
-ge –大于等于則為真
-lt –小于則為真
-le –小于等于則為真
if test $[num1] -eq $[num2];then
if [ $[num1] -eq $[num2] ];then
5、邏輯判斷
-a 和 && –邏輯與
-o 和 || –邏輯或
! –非
優先級:與>或>非
if test -e $1 -o -e $2;then –判斷是否有一個文件存在
if [ -e $1 -o -e $2 ];then –同上
if test ! -e $1 -o ! -e $2;then –判斷兩個文件沒有同時存在
if [ ! -e $1 -o ! -e $2 ];then –同上
?
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END