Linux就該這么學(xué) 6 | Vim 編輯器與 Shell 命令腳本



一、Vim 文本編輯器

在 Linux 系統(tǒng)中一切都是文件,而配置一個(gè)服務(wù)就是在修改其配置文件的參數(shù)

1. Vim 編輯器模式

vim 編輯器模式 說明
命令模式默認(rèn) 控制光標(biāo)移動(dòng),可對(duì)文本進(jìn)行復(fù)制、粘貼、刪除和查找等工作
編輯模式 正常的文本錄入
末行模式 保存或退出文檔,以及設(shè)置編輯環(huán)境
Vim 編輯器模式的切換方法

提示:

  • 在每次運(yùn)行 Vim 編輯器時(shí),默認(rèn)進(jìn)入命令模式,此時(shí)需要先切換到輸入模式后再進(jìn)行文檔編寫工作,而每次在編寫完文檔后需要先返回命令模式,然后再進(jìn)入末行模式,執(zhí)行文檔的保存或退出操作
  • 在 Vim 中,無法直接從輸入模式切換到末行模式
末行模式中可用的命令
  • 末行模式主要用于保存或退出文件,以及設(shè)置 Vim 編輯器的工作環(huán)境,還可以讓用戶執(zhí)行外部的 Linux 命令或跳轉(zhuǎn)到所編寫文檔的特定行數(shù)
命令 作用
:w 保存
:q 退出
:q! 強(qiáng)制退出(放棄對(duì)文檔的修改)
:wq! 強(qiáng)制保存退出
:set nu 顯示行號(hào)
:set nonu 不顯示行號(hào)
:命令 執(zhí)行該命令
:整數(shù) 跳轉(zhuǎn)到該行
:s/one/two 將當(dāng)前光標(biāo)所在行的第一個(gè) one 替換成 two
:s/one/two/g 將當(dāng)前光標(biāo)所在行的所有 one 替換成 two
:%s/one/two/g 將全文中的所有 one 替換成 two
?字符串 在文本中從下至上搜索該字符串
/字符串 在文本中從上至下搜索該字符串
Vim 編輯器

a、 i、 o 三個(gè)鍵從命令模式切換到輸入模式

  • a 鍵與 i 鍵分別是在光標(biāo)后面一位和光標(biāo)當(dāng)前位置切換到輸入模式
  • o 鍵則是在光標(biāo)的下面再創(chuàng)建一個(gè)空行,此時(shí)可敲擊 a 鍵進(jìn)入到編輯器的輸入模式

2. Vim 中常用的命令

命令 作用
dd 刪除(剪切)光標(biāo)所在整行
5dd 刪除(剪切)從光標(biāo)處開始的 5 行
yy 復(fù)制光標(biāo)所在整行
5yy 復(fù)制從光標(biāo)處開始的 5 行
n 顯示搜索命令定位到的下一個(gè)字符串
N 顯示搜索命令定位到的上一個(gè)字符串
u 撤銷上一步的操作
p 將之前刪除(dd)或復(fù)制(yy)過的數(shù)據(jù)粘貼到光標(biāo)后面

二、配置主機(jī)名稱

為了便于在局域網(wǎng)中查找某臺(tái)特定的主機(jī),或者對(duì)主機(jī)進(jìn)行區(qū)分,除了要有 IP 地址外,還要為主機(jī)配置一個(gè)主機(jī)名,主機(jī)之間可以通過這個(gè)類似于域名的名稱來相互訪問

  • 修改主機(jī)名稱文件
    vim /etc/hostname
  • 查看主機(jī)名
    hostname

三、配置網(wǎng)卡

網(wǎng)卡 IP 地址配置的是否正確是兩臺(tái)服務(wù)器是否可以相互通信的前提

在 Linux 系統(tǒng)中,一切都是文件,因此配置網(wǎng)絡(luò)服務(wù)的工作其實(shí)就是在編輯網(wǎng)卡配置文件

提示:

  • 在 RHEL 5、 RHEL 6 中,網(wǎng)卡配置文件的前綴為 eth,第 1 塊網(wǎng)卡為eth0,第 2 塊網(wǎng)卡為 eth1,以此類推
  • 在 RHEL 7 中,網(wǎng)卡配置文件的前綴則以 ifcfg開始,加上網(wǎng)卡名稱共同組成了網(wǎng)卡配置文件的名字,例如 ifcfg-eno16777736;好在除了文件名變化外也沒有其他大的區(qū)別

cd /etc/sysconfig/network-scripts
ls

vim ifcfg-ens33

默認(rèn)

提示:

  • 配置為開機(jī)自啟動(dòng),并且 IP地址、子網(wǎng)、網(wǎng)關(guān)等信息由人工指定
參數(shù) 說明
設(shè)備類型 TYPE=Ethernet
地址分配模式 BOOTPROTO=static
網(wǎng)卡名稱 NAME=ens3
是否啟動(dòng) ONBOOT=yes
IP 地址 IPADDR=192.168.10.10
子網(wǎng)掩碼 NETMASK=255.255.255.0
網(wǎng)關(guān)地址 GATEWAY=192.168.10.1
DNS 地址 DNS1=192.168.10.1
  • 重啟網(wǎng)卡設(shè)備
    systemctl restart network

四、配置 Yum 軟件倉庫

Yum 軟件倉庫的作用是為了進(jìn)一步簡(jiǎn)化 RPM 管理軟件的難度以及自動(dòng)分析所需軟件包及其依賴關(guān)系的技術(shù)

  • 進(jìn)入yum配置文件夾
    cd /etc/yum.repos.d/
    ls
  • 新建rhel7.repo
    vim rhel7.repo

五、編寫 Shell 腳本

工作方式 英文 說明
交互式 Interactive 用戶每輸入一條命令就立即執(zhí)行
批處理 Batch 由用戶事先編寫好一個(gè)完整的 Shell 腳本, Shell 會(huì)一次性執(zhí)行腳本中諸多的命令

1. 編寫簡(jiǎn)單的腳本

  • 查看當(dāng)前命令行終端解釋器
    echo $SHELL
  • 查看當(dāng)前所在工作路徑并列出當(dāng)前目錄下所有的文件及屬性信息
    vim test.sh
#!/bin/bash
#For Example BY Ricsy
pwd
ls -al

提示:

  • 第一行的腳本聲明(#!)用來告訴系統(tǒng)使用哪種 Shell 解釋器來執(zhí)行該腳本
  • 第二行的注釋信息(#)是對(duì)腳本功能和某些命令的介紹信息,使得自己或他人在日后看到這個(gè)腳本內(nèi)容時(shí),可以快速知道該腳本的作用或一些警告信息
  • 第三、四行的可執(zhí)行語句也就是我們平時(shí)執(zhí)行的 Linux 命令了
  • 執(zhí)行
    sh test.sh

    chmod +x test.sh
    ./test.sh

2. 接收用戶的參數(shù)

Shell 腳本程序中的參數(shù)位置變量

提示:

  • $0 對(duì)應(yīng)的是當(dāng)前 Shell 腳本程序的名稱
  • $#對(duì)應(yīng)的是總共有幾個(gè)參數(shù)
  • $*對(duì)應(yīng)的是所有位置的參數(shù)值
  • $?對(duì)應(yīng)的是顯示上一次命令的執(zhí)行返回值
  • $1、$2、$3……則分別對(duì)應(yīng)著第 N 個(gè)位置的參數(shù)值

如:

vim example.sh

#!/bin/bash
echo "當(dāng)前腳本名稱為$0"
echo "總共有$#個(gè)參數(shù),分別是$*。 "
echo "第 1 個(gè)參數(shù)為$1,第 5 個(gè)為$5。 "

sh example.sh one two three four five six

3. 判斷用戶的參數(shù)

按照測(cè)試對(duì)象來劃分,條件測(cè)試語句可以分為 4 種:

1. 文件測(cè)試語句

文件測(cè)試所用的參數(shù)

運(yùn)算符 作用
-d 測(cè)試文件是否為目錄類型
-e 測(cè)試文件是否存在
-f 判斷是否為一般文件
-r 測(cè)試當(dāng)前用戶是否有權(quán)限讀取
-w 測(cè)試當(dāng)前用戶是否有權(quán)限寫入
-x 測(cè)試當(dāng)前用戶是否有權(quán)限執(zhí)行

如:

  1. 判斷/etc/fstab 是否為一個(gè)目錄類型的文件,然后通過 Shell 解釋器的內(nèi)設(shè)$?變量顯示上一條命令執(zhí)行后的返回值。如果返回值為 0,則目錄存在;如果返回值為非零的值,則意味著目錄不存在
    [ -d /etc/fstab ]
    echo $?
  1. 判斷/etc/fstab 是否為一般文件,如果返回值為 0,則代表文件存
    在,且為一般文件
    [ -f /etc/fstab ]
    echo $?
2. 邏輯測(cè)試語句
  • &&表示當(dāng)前面的命令執(zhí)行成功后才會(huì)執(zhí)行它后面的命令
  • ||表示當(dāng)前面的命令執(zhí)行失敗后才會(huì)執(zhí)行它后面的命令
  • !表示把條件測(cè)試中的判斷結(jié)果取相反值

如:

  1. 判斷當(dāng)前登錄的用戶是否為非管理員用戶
    [ ! $USER = root ] && echo "user" || echo "root"
3. 整數(shù)值比較語句

可用的整數(shù)比較運(yùn)算符

運(yùn)算符 作用
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于

如:

  1. 10 是否大于 10
    [ 10 -gt 10 ]
    echo $?
  1. 獲取內(nèi)存可用量
    free -m
    free -m | grep Mem:
    free -m | grep Mem: | awk '{print $4}'
FreeMem=`free -m | grep Mem: | awk '{print $4}'`

echo $FreeMem

使用整數(shù)運(yùn)算符來判斷內(nèi)存可用量的值是否小于 1024,若小
于則會(huì)提示“Insufficient Memory”(內(nèi)存不足)的字樣
[ $FreeMem -lt 1024 ] && echo "Insufficient Memory"

4. 字符串比較語句
  • 判斷測(cè)試字符串是否為空值,或兩個(gè)字符串是否相同
  • 用來判斷某個(gè)變量是否未被定義(即內(nèi)容為空值)

常見的字符串比較運(yùn)算符

運(yùn)算符 作用
= 比較字符串內(nèi)容是否相同
!= 比較字符串內(nèi)容是否不同
-z 判斷字符串內(nèi)容是否為空

如:

  1. 判斷 String 變量是否為空值,進(jìn)而判斷是否定義了這個(gè)變量
    [ -z $String]
    echo $?
  1. 環(huán)境變量值 LANG 不是英語(en.US)時(shí),則會(huì)滿足邏輯測(cè)試條件并輸出“Not en.US”(非英語)的字樣
    [ $LANG!="en.US" ] && echo "Not en.US"

六、流程控制語句

1. if 條件測(cè)試語句

單分支的 if 語句

if 條件語句的單分支結(jié)構(gòu)由 if、 then、 fi 關(guān)鍵詞組成,而且只在條件成立后才執(zhí)行預(yù)設(shè)的命令,相當(dāng)于口語的“如果……那么……”


如:

  1. 單分支的 if 條件語句來判斷/media/cdrom 文件是否存在,若存在就結(jié)束條件判斷和整個(gè) Shell 腳本,反之則去創(chuàng)建這個(gè)目錄
    vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then 
mkdir -p $DIR
fi
雙分支的 if 語句

if 條件語句的雙分支結(jié)構(gòu)由 if、 then、 else、 fi 關(guān)鍵詞組成,它進(jìn)行一次條件匹配判斷,如果與條件匹配,則去執(zhí)行相應(yīng)的預(yù)設(shè)命令;反之則去執(zhí)行不匹配時(shí)的預(yù)設(shè)命令,相當(dāng)于口語的“如果……那么……或者……那么……”

如:

  1. 驗(yàn)證某臺(tái)主機(jī)是否在線
    vim chkhost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi

sh chkhost.sh 192.168.10.10

多分支的 if 語句

if 條件語句的多分支結(jié)構(gòu)由 if、 then、 else、 elif、 fi 關(guān)鍵詞組成,它進(jìn)行多次條件匹配判斷,這多次判斷中的任何一項(xiàng)在匹配成功后都會(huì)執(zhí)行相應(yīng)的預(yù)設(shè)命令,相當(dāng)于口語的“如果……那么……如果……那么……”


如:

多分支的 if 條件語句來判斷用戶輸入的分?jǐn)?shù)在哪個(gè)成績(jī)區(qū)間內(nèi),然后輸出如Error、Excellent、 Pass、 Fail 等提示信息
vim chkscore.sh

#!/bin/bash
read -p "Enter your score(0-100): " GRADE
if [ $GRADE -gt 100 ] || [ $GRADE -lt 0 ] ; then
echo "$GRADE is Error"
else
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
fi

sh chkscore.sh

提示:

  • 在 Linux 系統(tǒng)中, read 是用來讀取用戶輸入信息的命令,能夠把接收到的用戶輸入信息賦值給后面的指定變量, -p 參數(shù)用于向用戶顯示一定的提示信息

2. for 條件循環(huán)語句

for 循環(huán)語句允許腳本一次性讀取多個(gè)信息,然后逐一對(duì)信息進(jìn)行操作處理,當(dāng)要處理的數(shù)據(jù)有范圍時(shí),使用 for 循環(huán)語句再適合不過了

如:

1.使用 for 循環(huán)語句從列表文件中讀取多個(gè)用戶名,然后為其逐一創(chuàng)建用戶賬戶并設(shè)置密碼

  • 用戶列表
    vim users.txt
andy
barry
carl
duke
eric
george
  • 腳本
    vim Example.sh
#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done

提示:

  • 執(zhí)行批量創(chuàng)建用戶的 Shell 腳本 Example.sh,在輸入為賬戶設(shè)定的密碼后將由腳本自動(dòng)檢查并創(chuàng)建這些賬戶。由于已經(jīng)將多余的信息通過輸出重定向符轉(zhuǎn)移到了/dev/null 黑洞文件中,因此在正常情況下屏幕窗口除了“用戶賬戶創(chuàng)建成功”(Create success)的提示后不會(huì)有其他內(nèi)容
  • 在 Linux 系統(tǒng)中, /etc/passwd 是用來保存用戶賬戶信息的文件。如果想確認(rèn)這個(gè)腳本是否成功創(chuàng)建了用戶賬戶,可以打開這個(gè)文件,看其中是否有這些新創(chuàng)建用戶信息
  1. 從文本中自動(dòng)讀取主機(jī)列表,然后自動(dòng)逐個(gè)測(cè)試這些主機(jī)是否在線
    vim ipadds.txt
192.168.10.10
192.168.10.11
192.168.10.12

vim CheckHosts.sh

#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /d
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done

3. while 條件循環(huán)語句

while 條件循環(huán)語句是一種讓腳本根據(jù)某些條件來重復(fù)執(zhí)行命令的語句,它的循環(huán)結(jié)構(gòu)往往在執(zhí)行前并不確定最終執(zhí)行的次數(shù),完全不同于 for 循環(huán)語句中有目標(biāo)、有范圍的使用場(chǎng)景。 while 循環(huán)語句通過判斷條件測(cè)試的真假來決定是否繼續(xù)執(zhí)行命令,若條件為真就繼續(xù)執(zhí)行,為假就結(jié)束循環(huán)

如:

  1. 猜測(cè)數(shù)值大小
    vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品實(shí)際價(jià)格為 0-999 之間,猜猜看是多少? "
while true
do
read -p "請(qǐng)輸入您猜測(cè)的價(jià)格數(shù)目: " INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答對(duì)了,實(shí)際價(jià)格是 $PRICE"
echo "您總共猜 g $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了! "
else
echo "太低了! "
fi
done

4. case 條件測(cè)試語句

case 語句是在多個(gè)范圍內(nèi)匹配數(shù)據(jù),若匹配成功則執(zhí)行相關(guān)命令并結(jié)束整個(gè)條件測(cè)試;而如果數(shù)據(jù)不在所列出的范圍內(nèi),則會(huì)去執(zhí)行星號(hào)(*)中所定義的默認(rèn)命令

vim Checkkeys.sh

#!/bin/bash
read -p "請(qǐng)輸入一個(gè)字符,并按 Enter 鍵確認(rèn): " KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您輸入的是 字母。 "
;;
[0-9])
echo "您輸入的是 數(shù)字。 "
;;
*)
echo "您輸入的是 空格、功能鍵或其他控制字符。 "
esac

七、計(jì)劃任務(wù)服務(wù)程序

計(jì)劃任務(wù)分為一次性計(jì)劃任務(wù)與長期性計(jì)劃任務(wù)

一次性計(jì)劃任務(wù)-at

  • 一次性計(jì)劃任務(wù)只執(zhí)行一次,一般用于滿足臨時(shí)的工作需求

提示:

  • 可以用 at命令實(shí)現(xiàn)這種功能
    at [時(shí)間]
  • 如果想要查看已設(shè)置好但還未執(zhí)行的一次性計(jì)劃任務(wù)
    at -l
  • 要想將其刪除
    atrm [任務(wù)序號(hào)]
  • 在使用 at 命令來設(shè)置一次性計(jì)劃任務(wù)時(shí),默認(rèn)采用的是交互式方法
  • Ctrl + D組合鍵來結(jié)束編寫計(jì)劃任務(wù)

at 23:30
systemctl restart httpd
at -l
atrm 1
at -l

echo "systemctl restart httpd" | at 23:30
at -l
atrm 1
at -l

長期性計(jì)劃任務(wù)-crondtab

提示:

  • 創(chuàng)建、編輯計(jì)劃任務(wù)的命令為
    crontab -e
  • 查看當(dāng)前計(jì)劃任務(wù)的命令為
    crontab -l
  • 刪除某條計(jì)劃任務(wù)的命令為
    crontab -r
  • 如果您是以管理員的身份登錄的系統(tǒng)
    crontab -u
    來編輯他人的計(jì)劃任務(wù)

分、時(shí)、日、月、星期

字段 說明
取值為 0~59 的整數(shù)
時(shí) 取值為 0~23 的任意整數(shù)
取值為 1~31 的任意整數(shù)
取值為 1~12 的任意整數(shù)
星期 取值為 0~7 的任意整數(shù),其中 0 與 7 均為星期日
命令 要執(zhí)行的命令或程序腳本

如:

  1. 在每周一、三、五的凌晨 3 點(diǎn) 25 分,都需要使用 tar 命令把某個(gè)網(wǎng)站的數(shù)據(jù)目錄進(jìn)行打包處理,使其作為一個(gè)備份文件

crontab -e

25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

crontab -l

  1. 每周一至周五的凌晨 1 點(diǎn)鐘自動(dòng)清空/tmp 目錄內(nèi)的所有文件

crontab -e

0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

crontab -l

說明:

  • 除了用逗號(hào)(,)來分別表示多個(gè)時(shí)間段,例如“8,9,12”表示 8 月、 9 月
    和 12 月。還可以用減號(hào)(-)來表示一段連續(xù)的時(shí)間周期(例如字段“日”的取值為“12-15”,則表示每月的 12~15 日)。以及用除號(hào)(/)表示執(zhí)行任務(wù)的間隔時(shí)間(例如“*/2”表示每隔2 分鐘執(zhí)行一次任務(wù))
  • 在 crond 服務(wù)的配置參數(shù)中,可以像 Shell 腳本那樣以#號(hào)開頭寫上注釋信息,這樣在日后回顧這段命令代碼時(shí)可以快速了解其功能、需求以及編寫人員等要信息
  • 計(jì)劃任務(wù)中的“分”字段必須有數(shù)值,絕對(duì)不能為空或是號(hào),而“日”和“星期”字段不能同時(shí)使用,否則就會(huì)發(fā)生沖突
  • 在 crond 服務(wù)的計(jì)劃任務(wù)參數(shù)中,所有命令一定要用絕對(duì)路徑的方式來寫,可以用type或whereis查看

更新中......


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

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 6,350評(píng)論 0 10
  • 第 2 章 SHELL 基礎(chǔ)知識(shí)2.1 shell腳本我們?cè)谏厦婧?jiǎn)單介紹了一下什么是shell腳本,現(xiàn)在我們來進(jìn)一...
    LiWei_9e4b閱讀 1,650評(píng)論 0 0
  • 一、shell腳本介紹 1.1 開頭(環(huán)境使用shebang機(jī)制) #!/bin/bash 必須寫在文件首行 符號(hào)...
    優(yōu)果馥斯閱讀 3,625評(píng)論 0 1
  • 1、文件和目錄: # cd /home 進(jìn)入 '/home' 目錄 # cd .. ...
    XDgbh閱讀 2,161評(píng)論 0 1
  • 大家的期末成績(jī)又都應(yīng)該下來了吧?那你們考的理不理想呢?反正我有的不錯(cuò),但有的就不太好了,尤其是數(shù)學(xué),數(shù)學(xué)考了80...
    劉美瑩閱讀 248評(píng)論 0 1

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