程序員必知必會的 Linux系列 —— shell 篇

1. shell 基礎

  • shell 是一個命令行解釋器,它爲用戶提供了一個向 Linux 內核發送請求以便運行程序的界面系統級程序
  • 用戶能夠用 Shell 來啓動、掛起、中止或者編寫一些程序
  • Shell 仍是一個功能至關強大的編程語言,易編寫,易調試,靈活性較強。
  • Shell 是解釋執行的腳本語言,在 Shell 中能夠直接調用 Linux 系統命令。

1.1 echo

  • 輸出命令
  • -e:激活轉義字符
echo hello
echo -e "a\tb"
複製代碼

1.2 編寫執行 shell

hello.shhtml

#!/bin/bash
echo hello
//經過Bash調用執行腳本
sh hello.sh
//賦予執行權限,直接運行
chmod 755 hello.sh
chmod u+x hello.sh
./hello.sh
複製代碼

1.3 別名

  • 命令別名就是小名
  • 臨時生效 alias cp="cp -i"
  • 寫入環境變量配置文件 vi ~/.bashrc
  • source ~/.bashrc
  • 刪除別名 unalias 別名

1.4 命令的生效順序

  • 絕對路徑或者相對路徑
  • 別名
  • bash 內部命令
  • 按照$PATH環境變量定義的目錄查找順序找到的第一個命令

1.5 命令快捷鍵

命令 含義
ctrl+c 強制終止當前命令
ctrl+l 清屏
ctrl+a 光標移動到命令行首
ctrl+e 光標移動到命令行尾
ctrl+u 從光標所在的位置刪除到行首

1.6 歷史命令

  • history [選項] [歷史命令保存文件]
  • 選項
    • -c 清空歷史命令
    • -w 把緩存中的歷史命令寫入歷史命令保存文件 ~/.bash_history
  • 默認保存 1000 條 /etc/profile HISSIZE=10000

1.7 調用

  • 使用上下箭頭調用之前的歷史命令
  • 使用 !n 重複執行第 n 條歷史命令
  • 使用 !! 重複執行上一條命令
  • 使用 !字符 重複執行最後一條以該字符串開頭的命令
history -c
1  echo 1
2  echo 2
3  echo 3
!2
!!
!echo
複製代碼

1.8 輸出重定向

1.8.1 標準輸入輸出

設備 設備文件名 文件描述符 類型
鍵盤 /dev/stdin 0 標準輸入
顯示器 /dev/stdout 1 標準輸出
顯示器 /dev/stderr 2 標準錯誤輸出
類型 符號 做用
標準輸出重定向 命令 > 文件 以覆蓋的方式,把命令的正確輸出輸出到指定的文件或設備當中
標準輸出重定向 命令 >> 文件 以追加的方式,把命令的正確輸出輸出到指定的文件或設備當中
錯誤輸出重定向 命令>文件 以覆蓋的方式,把命令的錯誤輸出輸出到指定的文件或設備當中
錯誤輸出重定向 命令>>文件 以追加的方式,把命令的錯誤輸出輸出到指定的文件或設備當中
正確輸出和錯誤輸出同時保存 命令>文件 2>&1 以覆蓋的方式,把正確輸出和錯誤輸出都保存到同一個文件當中
正確輸出和錯誤輸出同時保存 命令>文件 2>>&1 以追加的方式,把正確輸出和錯誤輸出都保存到同一個文件當中
正確輸出和錯誤輸出同時保存 命令&>文件 以覆蓋的方式,把正確輸出和錯誤輸出都保存到同一個文件當中
正確輸出和錯誤輸出同時保存 命令&>>文件 以追加的方式,把正確輸出和錯誤輸出都保存到同一個文件當中
正確輸出和錯誤輸出同時保存 命令>>文件 1 2>文件 2 以覆蓋的方式,正確的輸出追加到文件 1 中,把錯誤輸出追加到文件 2 中

1.8.2 輸入重定向

  • wc命令的功能爲統計指定文件中的行數、字數、字節數, 並將統計結果顯示輸出
  • 命令 < 文件把文件作爲命令的輸入
wc < a.txt;
複製代碼

1.9 管道符號

1.9.1 多命令順序執行

多命令執行符 格式 做用 案例
; 命令 1;命令 2 多個命令執行,命令之間沒有任何邏輯聯繫 echo 1;echo 2;
&& 命令 1&&命令 2 邏輯與 當命令 1 正確執行,則命令 2 纔會執行 當命令 1 執行不正確,則命令 2 不會執行 echo 1&&echo 2;
\ 命令 1\ 命令 2 邏輯或 當命令 1 執行不正確,則命令 2 纔會執行 當命令 1 正確執行,則命令 2 不會執行 echo 1\echo 2;
echo 1;echo 2;
echo 1&&echo 2;
echo 1||echo 2;
複製代碼

1.9.2 管道符號

  • 命令 1 的正確輸出會做爲命令 2 的操做對象
  • 命令 1|命令 2
ls /etc/ | more
netstat -an | grep ESTABLISHED | wc -l
複製代碼

1.9.3 通配符

  • 匹配文件名和目錄名
通配符 做用
? 匹配一個任意字符
* 匹配 0 個或任意字符,也就是能夠匹配任意內容
[] 匹配中括號中任意一個字符
[-] 匹配中括號中任意一個字符,-表明範圍
[^] 匹配不是中括號中的一個字符

1.9.4 其它符號

符號 做用
'' 單引號。在單引號中全部的特殊符號,如$和`都沒有特殊含義
"" 雙引號,在雙引號裏特殊符號都沒有特殊含義,可是 $ ` \ 例外,擁有調用變量值,引用命令和轉義的含義
`` 反引號,擴起來的是系統命令
$() 和反引號同樣
# 在 shell 腳本中,#開頭的行表明註釋
$ 用於調用變量的值
\ 轉義符號
echo '$PATH'
echo "$PATH"
echo `ls`
echo $(ls)
echo -e "a\tb"
複製代碼

2. 變量

2.1 什麼是變量

  • 能夠變化的量
  • 變量必須以字母或下劃線開頭,名字中間只能由字母,數字和下劃線組成
  • 變量名的長度不得超過 255 個字符
  • 變量名在有效範圍內必須惟一
  • 變量默認類型都是字符串

2.2 變量的分類

  • 字符串
  • 整型
  • 浮點型
  • 日期型

2.3 用戶自定義變量

  • 這些變量的值是本身定義的
  • 變量名不能爲數字開頭
  • 等號左右兩邊不能有空格

2.3.1 定義變量

name = "james";
age = 10;
複製代碼

2.3.2 輸出變量值

echo $變量名
複製代碼

2.3.3 值默認都是字符串

$ x=1
$ y=2
$ z=3
$ k=$x+$y+$z
$ echo $k
1+2+3
複製代碼

2.3.4 在賦值的時候引用變量

m="$x"2
n=${x}2
echo $m $n
複製代碼

2.3.5 set

  • 查詢系統中默認全部已經生效的變量,包括系統變量,也包括自定義變量
set | grep james
複製代碼

2.3.6 unset

  • 刪除變量
unset a
複製代碼

2.4 環境變量

  • 環境變量是全局變量,而自定義變量是局部變量
  • 自定義變量會在當前的 shell 中生效,而環境變量會在當前 shell 以及其子 shell 中生效
  • 這種變量主要保存的是和系統操做環境相關的數據
  • 變量能夠自定義,可是對系統生效的環境變量名和變量做用是固定的

2.4.1 自定義環境變量

export 變量名=變量值
export envName=prod
複製代碼

2.4.2 env

  • 僅僅用來查看環境變量,而不看到本地變量node

    env | grep envName
    複製代碼

2.4.3 經常使用環境變量

變量名 含義 示例
HOSTNAME 主機名 HOSTNAME=localhost
SHELL 當前的 shell SHELL=/bin/bash
HISTSIZE 歷史命令條數 HISTSIZE=1000
SSH_CLIENT 當前操做環境若是是用 SSH 鏈接的話,這裏會記錄客戶端 IP SSH_CLIENT=192.168.1.100 57596 22
USER 當前登陸的用戶 USER=root
echo $HOSTNAME
echo $SHELL
echo $HISTSIZE
echo $SSH_CLIENT
echo $USER
複製代碼

2.4.4 path

  • 系統搜索路徑
# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
複製代碼

若是想把一個自定義的腳本直接能夠執行,或者把這個文件拷貝到目標目錄下,或者把腳本所在目錄添加到環境變量中的PATH路徑中linux

/root/shells/hello.sh正則表達式

#!/bin/bash
echo hello
export PATH="$PATH":/root/shells
hello.sh
複製代碼

2.4.5 語系環境變量

  • 查詢當前系統語系
  • 在 Linux 中經過locale來設置程序運行的不一樣語言環境,locale 由 ANSI C 提供支持。locale 的命名規則爲<語言>_<地區>.<字符集編碼>,如 zh_CN.UTF-8,zh 表明中文,CN 表明大陸地區,UTF-8 表示字符集。
  • LANG: 定義系統主語系的變量
locale
LANG=zh_CN.UTF-8

echo $LANG
複製代碼

2.4.6 中文支持

  • 圖形界面能夠支持中文
  • 第三方工具好比 xshell 語系設置正確能夠支持中文
  • 虛擬機中的純字符界面不支持中文

2.5 位置參數變量

  • 這種變量主要是用來向腳本當中傳遞參數或數據的,變量名不能自定義,變量做用是固定的
位置參數變量 做用
$n n 爲數字, 0 表明命令自己, 0表明命令自己, 1- 9 表明第 1 到第 9 個參數, 10 以上的參數須要用大括號包含 , 9表明第1到第9個參數,10以上的參數須要用大括號包含,如 {10}
$* 這個變量表明命令中全部的參數,$*把全部的變看數當作一個總體
$@ 這個變量也表明命令行中全部的參數,不過$@把每一個參數進行區分
$# 這個變量表明命令行中全部參數的個數

sum.shshell

#!/bin/bash
num1=$1
num2=$2
sum=$((num1+num2))
echo $sum
sh sum.sh 3 4
複製代碼

vi for.sh編程

#!/bin/bash
for i in "$@"
 do
   echo "i=$i"
 done
sh for.sh 1 2 3
i=1
i=2
i=3
複製代碼

vi for2.sh數組

#!/bin/bash
for i in "$#"
 do
   echo "i=$i"
 done
sh for2.sh 1 2 3
i=1 2 3
複製代碼

vi for3.sh緩存

#!/bin/bash
echo "$#"
sh for3.sh 1 2 3
3
複製代碼

2.6 預約義變量

  • 是腳本中已經定義好的變量,變量名不能自定義,變量做用也是固定的
位置參數變量 做用
$? 最後一次執行的命令的返回狀態。0 表示正確執行,非 0 表示不正確執行
$$ 當前進程的進程號(PID)
echo $?
echo $$
複製代碼

2.7 read

read [選項] [變量名]bash

選項 含義
-p 提示信息,在等待 read 輸入時,輸出提示信息
-t 秒數: read 命令會一直等待用戶輸入,使用此選項能夠指定等待時間
-n 字符數,read 命令只接受指定的字符數,就會執行
-s 隱藏輸入的數據,適用於機密信息的輸入
#!/bin/bash
read -p 'please input your name:' -t 5 name
echo -e "\n"
read -p 'please input you gender[m/f]:' -n 1 gender
echo -e "\n"
read -p 'please input your password:' -s password
echo -e "\n"
echo $name,$gender,$password
sh read.sh
複製代碼

3. 運算符

  • 弱類型而且默認是字符串類型

3.1 declare 命令

3.1.1 declare 命令

  • 用來聲明變量類型
  • declare [+/-] [選項] 變量名
選項 含義
- 給變量設定類型屬性
+ 取消變量的類型屬性
-a 將變量聲明爲數組類型
-i 將變量聲明爲整數型
-x 將變量聲明爲環境變量
-r 將變量聲明爲只讀變量
-p 顯示指定變量的被聲明的類型
a=1
b=2
c=$a+$b
echo $c
1+2
declare -i c=$a+$b //聲明成整型
echo $c
3
declare +i c //取消變量的類型屬性
c=$a+$b
echo $c
1+2
declare -i c="3" //給變量設定類型屬性
declare -p c //顯示指定變量的被聲明的類型
//declare -i c="3"

//聲明環境變量
declare -x kk=1
set | grep kk      //查看全部變量
env | grep kk      //只查看系統變量

declare -r x //只讀
x=2  //bash: x: readonly variable
複製代碼

3.1.2 數組

//聲明爲數組類型
declare -a names;

names[0]=zhangsan
names[1]=lisi

//默認只打印第一個元素
echo ${names}
zhangsan
//打印第2個元素
echo ${names[1]}
lisi
//打印所有
echo ${names[*]}
zhangsan lisi
複製代碼

3.1.3 聲明環境變量

  • export 最終執行的是declare -x命令
  • declare -p 能夠查看全部的類型
export NAME=james
declare -x NAME=james
複製代碼

3.1.4 只讀屬性

declare -r gender=m
gender=f
-bash: gender: readonly variable
複製代碼

3.1.5 查詢變量屬性

  • declare -p 查詢全部變量的屬性
  • declare -p 變量名 查詢指定變量的屬性

3.2 數值運算的方法

  • 只要用 declare 聲明變量的時候指定類型就能夠進行數值運算

3.2.1 expr 或 let

    • 號左右兩側必須有空格,不然仍是整塊輸出
num1=2
num2=3
sum=$(expr $num1 + $num2)
echo $sum
5
sum2=$(($num1+$num2))
echo $sum2
5
sum3=$[$num1+$num2]
echo $sum3
5

d=$(date)
echo $d
複製代碼

3.2.2 優先級

priority

result=$(((1+2)*4/2))
echo $result
6
複製代碼

4. 環境變量配置文件

4.1 source 命令

  • 修改完配置文件後,必須註銷從新登陸才能生效,使用 source 命令能夠不用從新登陸
  • source 配置文件
  • . 配置文件

4.2 環境變量配置文件簡介

  • PATH、HISTSIZE、PS一、HOSTNAME 等環境變量寫入對應的環境變量配置文件
  • 環境變量配置文件中主要是定義地系統操做環境生效的系統默認環境變量,如PATH等此文件登陸時起做用的環境變量
路徑 說明
/etc/profile
/etc/bashrc
~/.bash_profile 只會對當前用戶生效
~/.bashrc 只會對當前用戶生效

f49353175c1062b807c03b03bd9b5817

4.3 環境變量配置文件的功能

4.3.1 /etc/profile

  • 在這裏修改系統變量
cat  /etc/profile | grep USER
複製代碼
變量名 含義
USER 用戶名
LOGNAME 登陸名
MAIL 郵箱地址
PATH 查找路徑
HOSTNAME 主機名
umask 權限掩碼
/etc/profile.d/星.sh

4.3.2 ~/.bash_profile

  • 在這裏修改PATH路徑
  • 調用 ~/.bashrc

4.3.3 ~/.bashrc

  • 在這裏改別名,配置 alias
  • 調用 /etc/bashrc

4.3.4 /etc/bashrc

  • PS1 登陸提示符在這裏修改
  • umask
  • PATH變量
  • 調用 /etc/profile.d/星.sh文件

4.3.5. 其它配置文件

4.3.5.1 註銷時生效的環境變量配置文件
  • ~/.bash_logout
4.3.5.2 腳本歷史
  • 當正確退出計算機的時候會歷史記錄會寫入文件
  • ~/.bash_history
4.3.5.3 Shell 登陸信息
  • 本地終端歡迎信息 /etc/issue
  • 遠程終端歡迎信息 /etc/issue.net
  • 無論遠程仍是本地均可以生效 /etc/motd
參數 含義
\d 當前系統日期
\s 顯示操做系統名稱
\l 顯示登陸的終端號
\m 顯示硬件體系結構,如 i386 等
\n 顯示主機名
\o 顯示域名
\r 顯示內核版本
\t 顯示當前系統時間
\u 顯示當前登陸用戶的序列號
vi /etc/ssh/sshd_config
Banner /etc/issue.net
service sshd restart
複製代碼

4.正則表達式

4.1 概念

  • 正則表達式是用於描述字符排列和匹配模式的一種語法規則
  • 它主要用於字符串的模式分割、匹配查找及替換操做

4.2 通配符

  • 通配符用來匹配符合條件的文件名,通配符是徹底匹配。
  • ls find 這些命令不支持正則,只能使用通配符
符號 含義
? 匹配任意一個字符
* 匹配任意多個字符
[] 匹配中括號中範圍內的一個字符

4.3 正則表達式

  • 正則表達式是用來在文件中匹配符合條件的字符串,是包含匹配。
  • grep awk sed 等均可以支持正則表達式

4.4 元字符

alias grep='grep --color=auto'
複製代碼
元字符 做用 示例
* 前一個字符匹配 0 次或任意屢次 grep 1* reg.txt
. 匹配除換行符外的任意一個字符 grep . reg.txt
^ 匹配行首。例如,^hello 會匹配以 hello 開頭的行 grep ^a reg.txt
$ 匹配行尾。例如,hello& 會匹配以 hello 結尾的行 grep a$ reg.txt
[] 匹配屮柄號屮指定的任意一個字符,並且只匹配一個字符。 例如.[aoeiu]匹配任意一個元音字母, [0-9] 匹配任意一位數字, [a-z][0-9] 匹配由小寫字母和一位數字構成的兩位字符 grep ab[bc]c reg.txt
[^] 匹配除中括號中的字符之外的任意一個字符。例如,[^0-9] 匹配任意一位非數字字符, [^a-z] 匹配任意一位非小寫字母 grep a[^fg]c reg.txt
\ 轉義符,用於取消特殊符號的含義 grep .$ reg.txt
{n} 表示其前面的字符剛好出現 n 次。例如,[0-9]{4} 匹配 4 位數字,[1][3-8][0-9]{9} 匹配手機號碼 grep "a{1}" reg.txt
(n,} 表示其前面的字符出現很多於 n 次。例如,[0-9]{2,} 匹配兩位及以上的數字 grep "a{1,}" reg.txt
{n,m} 表示其前面的字符至少出現 n 次,最多出現 m 次。例如,[a-z]{6,8} 匹配 6〜8 位的小寫字母 grep "a{2,3}" reg.txt

4.5 cut

  • cut 用來提取文本中的某一部分文本
  • cut [選項] 文件名
    • -f 列號,用來指定要提取的列
    • -d 分隔符,按照指定分隔符分割列,默認分隔符是 TAB 製表符

提取用戶名和它使用的 shellmarkdown

cat /etc/passwd | cut -f 1,7 -d :
複製代碼

4.6 printf

  • 按規定格式輸出
  • printf 輸出類型 輸出內容
參數 含義
%ns 輸出字符串,n 是數字指代輸出幾個字符
%ni 輸出整數,n 是指輸出幾個數字
%m.nf 輸出浮點數,m 和 n 是數字,指代輸出的整數位數和小數位數,如%6.2f 表明輸出 6 位位,2 位小數,4 位整數
printf "%s\t%s\t%s\t%s\t%s\t\%s\n" $(df -h | grep /dev/vda1) | cut -f 1,5
複製代碼

4.7 awk

  • awk '條件 1{動做 1} 條件 2{動做 2}...' 文件名
  • 條件(Pattern)
    • 通常使用關係表達式做爲條件
    • x > 10 判斷變量 x 是否大於 10
    • x >=10 大於等於
    • x <=10 小於等於
  • 動做(Action)
    • 格式化輸出
  • 0 整行 0 整行 1 第一列...
df -h | grep /dev/vda1 |awk '{print $5}'| cut -d '%' -f 1
複製代碼

4.7.1 begin end

  • awk 能夠正確截取製表符和空格
  • begin 在全部的輸出以前打印
  • end 在全部的輸出以後打印
echo "" > numbers.txt
awk 'BEGIN{print "開始"}END{print "結束"}' numbers.txt
複製代碼

4.7.2 FS

  • Field Separator,字段分隔符
awk 'BEGIN{FS=":"}{print $1"\t"$2}' /etc/passwd
複製代碼

4.7.3 聲明變量

numbers.txt

1
2
3
awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}' numbers.txt
6
複製代碼

4.7.4 多條件

score.txt

zhangsan 91
li 81
wangwu 71
awk '$2>90{print $1"\t優秀"}$2>80{print $2"\t良好"}' score.txt
複製代碼

4.7.5 NR

  • NR,表示 awk 開始執行程序後所讀取的數據行數
awk '{print NR,$0}' score.txt
複製代碼

4.7.6 OFS

  • OFS Out of Field Separator,輸出字段分隔符
echo "i love you" | awk 'BEGIN{ FS=" ";OFS="-" }{print $1,$2,$3}'
複製代碼

4.8 sed 命令

  • sed 是一個輕量級編輯器,主要用來對數據進行選取、替換、替換和新增操做
  • sed [選項] '[動做]' 文件名
  • 全部的動做都必須用單號號括起來
  • 類型相似於批量vi操做

4.8.1 動做

參數 含義 示例
a 追加,在每一行或者指定行下面添加一行或多行 sed '1a newline' score.txt
c 行替換,用 c 後面的字符串替換掉原始整個數據行 sed 'c newline' score.txt
s 字符串替換,用一個字符串替換另一個字符串,格式爲 "行範圍 s/舊字符串/新字符串/g" sed '3s/lisi/lisisi/g' score.txt
i 插入,在當前行插入一行或多行 sed '1i newline' score.txt
d 刪除指定的行 sed '1,2d' score.txt
p 打印,輸出指定的行 sed -n '2p' score.txt

4.8.2 選項

參數 含義 示例
-n 通常 sed 命令會把全部的數據都輸出到屏幕上,若是加入此選項則只會把處理過的行輸出到屏幕上 sed -n '2p' score.txt
-e 容許對輸入數據應用多條 sed 編輯命令 sed -e 's/91/92/g;s/81/82/g' score.txt
-i 用 sed 的修改直接修改編輯的文件,而不是在屏幕上輸出 sed -i '1i newline' score.txt

4.9 排序命令 sort

  • sort [選項] 文件名
  • 選項
選項 含義
-f 忽略大小寫 sort -f -t ":" -n -k 5,5 /etc/passwd
-n 以數值型進行排序,默認使用字符串順序 sort -t ":" -n -k 3,3 /etc/passwd
-r 反向排序,默認從小到大 sort -r /etc/passwd
-t 指定分割符,默認分割符是製表符 sort -t ":" -k 3,3 /etc/passwd
-k n[,m] 按照指定的字段範圍排序。從第 n 個字段開始,到第 m 個字段結束,默認是到行尾 sort -t ":" -k 3,3 /etc/passwd
sort /etc/passwd
sort -r /etc/passwd
sort -t ":" -k 3,3 /etc/passwd
複製代碼

4.10 wc

  • wc [選項] 文件名
選項 含義
-l 只統計行數
-w 只容許單詞數
-m 只統計字符數
wc wc.txt
複製代碼

5. 流程控制

5.1 條件判斷

5.1.1 按照文件類型進行判斷

選項 含義
-d 文件是否存在而且是目錄
-e 文件是否存在
-f 文件是否存在而且是普通文件
-b 文件是否存在而且是塊設備文件
-c 文件是否存在而且是字符設備文件
-L 文件是否存在而且是連接文件
-p 文件是否存在而且是管道文件
-s 文件是否存在而且是否爲非空
-S 文件是否存在而且是套接字文件
touch 1.txt
test -e 1.txt
[-e 1.txt]
echo $?
複製代碼

exist.sh

[ -e 1.txt ]&&echo "yes"|| echo "no"
yes
[ -e 11.txt ]&&echo "yes"|| echo "no"
no
複製代碼

5.1.2 按照文件權限進行判斷

選項 含義
-r 文件是否存在,而且是否擁有讀權限
-w 文件是否存在,而且是否擁有寫權限
-x 文件是否存在,而且是否擁有執行權限
echo read  > read.txt
echo write  > write.txt
echo execute  > execute.txt

chmod u+w write.txt
chmod u+x execute.txt

[ -r read.txt ]&&echo "read yes"|| echo "no"
[ -w write.txt ]&&echo "write yes"|| echo "no"
[ -x execute.txt ]&&echo "execute yes"|| echo "no"
複製代碼

5.1.3 兩個文件間的比較

選項 含義
文件 1 -nt 文件 2 判斷文件 1 的修改時間是否比文件 2 的新
文件 1 -ot 文件 2 判斷文件 1 的修改時間是否比文件 2 的舊
文件 1 -ef 文件 2 判斷文件 1 和文件 2 的 inode 號是否一致,可用於判斷硬連接
[ write.txt -nt read.txt ]&&echo "write is older than read"|| echo "no"
[ read.txt -ot write.txt ]&&echo "read is older than write"|| echo "no"
ln execute.txt execute2.txt
[ execute.txt -ef execute2.txt ]&&echo "execute and execute2.txt are the same"|| echo "no"
複製代碼

5.1.4 兩個整數間的比較

選項 含義
整數 1 -eq 整數 2 判斷整數 1 是否和整數 2 相等
整數 1 -ne 整數 2 判斷整數 1 是否和整數 2 不相等
整數 1 -gt 整數 2 判斷整數 1 是否大於整數 2
整數 1 -lt 整數 2 判斷整數 1 是否小於整數 2
整數 1 -ge 整數 2 判斷整數 1 是否大於等於整數 2
整數 1 -le 整數 2 判斷整數 1 是否小於等於整數 2
[ 2 -eq 2 ]&&echo "2==2"|| echo "no"
[ 3 -ne 2 ]&&echo "2!=2"|| echo "no"
[ 3 -gt 2 ]&&echo "2>2"|| echo "no"
[ 1 -lt 2 ]&&echo "2<2"|| echo "no"
[ 2 -ge 2 ]&&echo "2>=2"|| echo "no"
[ 2 -le 2 ]&&echo "2<=2"|| echo "no"
複製代碼

5.1.5 字符串的判斷

選項 含義
-z 字符串 判斷字否串是否爲空
-n 字符中 判斷字符串是否爲非空
字符串 1 == 字符串 2 判斷字符串 1 是否和字符串 2 相等
字符串 1 != 字符串 2 判斷字符串 1 是否和字符串 2 不相等
name=james
[ -z "$name" ]&&echo "空"|| echo "非空"
[ -n "$name" ]&&echo "非空"|| echo "空"
name2=james
[ "$name" == "$name2" ]&&echo "相等"|| echo "不相等"
[ "$name" != "$name2" ]&&echo "不相等"|| echo "相等"
複製代碼

5.1.6 多重條件判斷

選項 含義
判斷 1 -a 判斷 2 邏輯與
判斷 1 -o 判斷 2 邏輯或
!判斷 邏輯非
[ 2 -gt 1 -a 3 -gt 2 ]&&echo "yes"|| echo "no"
[ 2 -gt 1 -a 3 -gt 4 ]&&echo "yes"|| echo "no"
[ 2 -gt 1 -o 3 -gt 4 ]&&echo "yes"|| echo "no"
[ ! 3 -gt 4 ]&&echo "yes"|| echo "no"
複製代碼

5.2 單分支 if 語句

  • if 語句使用fi結尾
  • [條件判斷式]就是使用test命令進行判斷,因此中括號和條件判斷式之間必須有空格
  • then 後面跟符合條件以後執行的程序,能夠放在[]以後,用;分隔,也能夠換行,不用;

5.2.1 語法

if [條件判斷];then
 代碼體
fi
if [條件判斷]
then
 代碼體
fi
if [ 2 -gt 1 ];then echo bigger; fi

if [ 2 -gt 1 ]
then
 echo bigger
fi
複製代碼

5.2.2 判斷當前用戶是不是 root 用戶

isRoot.sh

#!/bin/bash
user=$(whoami)
user=`whoami`
if [ "$user" == root ]
then
echo "我是root用戶"
fi
複製代碼

5.3 雙分支 if 語句

5.3.1 語法

if [條件判斷]
then
 代碼體1
else
 代碼體2
fi
複製代碼

5.3.2 判斷是否目錄

isDir.sh

#!/bin/bash
read -t 10 -p "請輸入一個路徑" dir
if [ -d "$dir" ]
then
  echo "$dir是目錄"
else
  echo "$dir不是目錄"
fi
複製代碼

5.4 多分支 if 語句

5.4.1 語法

if [條件判斷1]
then
 代碼體1
elif [條件判斷2]
 代碼體2
else
 代碼體3
fi
複製代碼

grade.sh

#!/bin/bash
read -p "請輸入一個分數" grade
if [ "$grade" -gt 90 ]
 then
  echo 優秀
elif [ "$grade" -gt 80 ]
  then
   echo 良
else
   echo 差
fi
複製代碼

5.5 case 語句

  • case 和 if 都是多分支判斷語句,if 能判斷多個條件,case 只能判斷一個條件

    5.5.1 語法

    case 變量名 in1)
      代碼塊1
      ;;
    值2)
      代碼塊2
     ;;
    *)
      代碼塊3
     ;;
    esac
    複製代碼

case.sh

#!/bin/bash
read -p "yes or no?" -t 30 choose
case $choose in
  "yes")
    echo '是'
    ;;
  "no")
    echo "否"
   ;;
  *)
    echo 其它
   ;;
esac
複製代碼

5.6 for 循環

5.6.1 語法

for 變量 in123
do
代碼塊
done
複製代碼

for.sh

#!/bin/bash
for i in 1 2 3
do
 echo $i
done
複製代碼

5.6.2 語法

#!/bin/bash
for((i=1;i<=10;i++));
do
 echo $(($i));
done
複製代碼

5.7 while 循環

  • while 循環是不定循環,也稱爲條件循環,只要條件判斷成立,就會一直繼續
while [條件判斷式]
do
 代碼塊
done
複製代碼

while.sh

#!/bin/bash
i=1
result=0
while [ $i -le 100 ]
 do
   result=$(($result+i))
   i=$(($i+1))
 done
echo $result
複製代碼

5.8 until 循環

  • 直到條件不成立中止

until.sh

#!/bin/bash
i=1
result=0
until [ $i -gt 100 ]
 do
   result=$(($result+i))
   i=$(($i+1))
 done
echo $result
複製代碼

6. 函數

  • linux shell 能夠用戶定義函數,而後在 shell 腳本中能夠隨便調用
  • 能夠帶function fun() 定義,也能夠直接fun() 定義,不帶任何參數
  • 調用函數不須要加()

6.1 簡單函數

[ function ] funcName [()] {
    action;
    [return int;]
}
start(){
>  echo start
> }
 start
#!/bin/bash
start(){
 echo start
}
start
複製代碼

6.2 返回值

  • 參數返回,能夠顯示加:return 返回,若是不加,將以最後一條命令運行結果,做爲返回值
sum(){
>  result=$(($1+$2))
>  return $result
> }
sum4 2 3
echo $?
5
複製代碼

6.3 參數說明

參數處理 說明
$# 傳遞到腳本的參數個數
$* 以一個單字符串顯示全部向腳本傳遞的參數
$@ 與$*相同,可是使用時加引號,並在引號中返回每一個參數
$$ 腳本運行的當前進程 ID 號
$? 顯示最後命令的退出狀態。0 表示沒有錯誤,其餘任何值代表有錯誤

7.shell 實戰

7.1 注意事項

  • 開頭加解釋器: #/bin/bash 和註釋說明
  • 命名建議規則: 變量名大寫、局部變量小寫,函數名小寫,名字體現出實際做用
  • 默認變量是全局的,在函數中變量 local 指定爲局部變量,避免污染其它做用域
  • set -e 遇到執行非 0 時退出腳本, set -x 打印執行過程
  • 寫腳本必定要先測試再上生產環境

7.2 檢查主機存活狀態

ip.sh

#!/bin/bash
for IP in $@; do
  if ping -c 1 $IP &>/dev/null; then
     echo "$IP is ok."
  else
     echo "$IP is wrong!"
  fi
done
sh ip.sh 127.0.0.1
複製代碼
相關文章
相關標籤/搜索