国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

linux編寫腳本之快速入門

這篇具有很好參考價值的文章主要介紹了linux編寫腳本之快速入門。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

在進行Linux測試時編寫腳本是必不可少的。最近經(jīng)常使用Linux,感覺太頻繁地敲擊鍵盤有些累了,于是想到了Shell腳本??梢园烟嗟拿顚懗梢粋€腳本,這樣每次執(zhí)行一遍 shell文件,就可以省去了敲擊鍵盤的時間。于是在網(wǎng)上搜了一些有關(guān)Linux下腳本編程的內(nèi)容。

Shell不僅僅是命令的收集,而且是一門非常棒的編程語言。您可以通過使用shell使大量的任務(wù)自動化,shell特別擅長系統(tǒng)管理任務(wù),尤其適合那些易用性、可維護性和便攜性比效率更重要的任務(wù)。

用戶可以使用任何文本編輯器編輯shell腳本文件,例如VI、gedit等。

Shell腳本的名稱可以隨便定義,也不要什么后綴名,例如可以寫abc,smartzip這類名稱。

1、創(chuàng)建腳本并運行Shell腳本

1.1 首先創(chuàng)建一個名為 script 的新目錄,它將托管我們所有的 bash 腳本。

腳本文件新建可以用touch命令,也可以直接用文本編輯器如vi、vim、gedit等新建并編輯,文件名為*.sh

shell腳本文件的名稱可以任意,但為了避免被誤認為是普通文件,后綴名為.sh代表是一個shell腳本文件(例如后綴名為.py代表是一個python文件)

linux編寫腳本之快速入門

1.2 編寫內(nèi)容

echo 'Hello, World!'

1.3 啟動shell腳本

跳轉(zhuǎn)到script路徑,輸入 bash script.sh 啟動shell腳本

linux編寫腳本之快速入門

你就會看到Hello, World!打印在屏幕上。

2、將 shell 腳本轉(zhuǎn)換為 bash 腳本

Bash是“Bourne-Again shell”的縮寫,它只是 Linux 中許多可用 shell 的一種。

shell 是一個命令行解釋器,它接受并運行命令。如果你以前運行過任何 Linux 命令,那么你已經(jīng)使用過 shell。當你在 Linux 中打開終端時,你已經(jīng)在運行系統(tǒng)的默認 shell。

Bash 通常是大多數(shù) Linux 發(fā)行版中的默認 shell。這就是為什么 bash 通常是 shell 的同義詞。Shell 只是一個程序,而 bash 是它的一個實現(xiàn)。還有其他這樣的 shell 程序,如 ksh、zsh等。如果你安裝了其他 shell,你也可以使用它來代替 bash。

shell 腳本通常具有幾乎相同的語法,但有時也會有所不同。例如,數(shù)組索引在 Zsh 中從 1 開始,而不是在 bash 中從 0 開始。如果為Zsh shell編寫的腳本有數(shù)組,則它在 bash 中將無法正常工作。

為了避免這種錯誤,你應(yīng)該告訴解釋器你的 shell 腳本是為 bash shell 編寫的。你是怎樣做的?你可以用shebang來實現(xiàn)這一點。

3、Shell 腳本的使用

1、 “#!/bin/bash”

這一行被稱為shebang 行,在某些文獻中,它被稱為hashbang 行,這是因為它以兩個字符hash ‘#’ 和bang ‘!’ 開頭。

#!/bin/sh (必須放在文件的第一行)

符號#!用來告訴系統(tǒng)它后面的參數(shù)是用來執(zhí)行該文件的程序。在這個例子中我們使用/bin/sh來執(zhí)行程序。

2、 注釋

在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結(jié)束。如同其他編程語言一樣,我們在編寫腳本時也應(yīng)該盡可能地添加注釋,那么即使相當長的時間內(nèi)沒有使用該腳本,我們也能在很短的時間內(nèi)明白該腳本的作用及工作原理。

3.、變量

在其他編程語言中您必須使用變量。在shell編程中,所有的變量都由字符串組成,并且您不需要對變量進行聲明。要賦值給一個變量,您可以這樣寫:變量名=值

取出變量值可以加一個美元符號($)在變量前面:

#!/bin/sh
#對變量賦值
a=“hello world”
#現(xiàn)在打印變量a的內(nèi)容
echo “A is:”
echo $a

文件內(nèi)容如下:

linux編寫腳本之快速入門

linux編寫腳本之快速入門

4、Shell命令和流程控制

在shell腳本中可以使用三類命令:

4.1 Unix 命令:
雖然在shell腳本中可以使用任意的Unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來進行文件和文字操作的。

常用命令語法及功能

指定欲顯示的文件內(nèi)容范圍,并將它們輸出到標準輸出設(shè)備比如:輸出每行第5個到第9個字符cut -b5-9 file.txt千萬不要和cat命令混淆,這是兩個完全不同的命令

cat file.txt: 輸出文件內(nèi)容到標準輸出設(shè)備(屏幕)上

file somefile: 得到文件類型

read var: 提示用戶輸入,并將輸入賦值給變量

sort file.txt: 對file.txt文件中的行進行排序

uniq: 刪除文本文件中出現(xiàn)的行列比如: sort file.txt | uniq

expr: 進行數(shù)學(xué)運算Example: add 2 and 3expr 2 "+" 3

find: 搜索文件比如:根據(jù)文件名搜索find . -name filename -print

tee: 將數(shù)據(jù)輸出到標準輸出設(shè)備(屏幕) 和文件比如:somecommand | tee outfile

basename file: 返回不包含路徑的文件名比如: basename /bin/tux將返回 tux

dirname file: 返回文件所在路徑比如:dirname /bin/tux將返回/bin

head file: 打印文本文件開頭幾行

tail file : 打印文本文件末尾幾行

sed:

Sed是一個基本的查找替換程序??梢詮臉藴瘦斎耄ū热缑罟艿溃┳x入文本,并將結(jié)果輸出到標準輸出(屏幕)。該命令采用正則表達式(見參考)進行搜索。不要和shell中的通配符相混淆。比如:將linuxfocus 替換為 LinuxFocus :cat text.file | sed ‘‘s/linuxfocus/LinuxFocus/’’ > newtext.fileawk: awk

用來從文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, ‘’{print $1 “,” $3 }''這里我們使用,作為字段分割符,同時打印第一個和第三個字段。如果該文件內(nèi)容如下: AdamBor, 34, IndiaKerry Miller, 22, USA命令輸出結(jié)果為:AdamBor, IndiaKerry Miller, USA

4.2 概念: 管道, 重定向和 backtick

這些不是系統(tǒng)命令,但是他們真的很重要。管道 (|) 將一個命令的輸出作為另外一個命令的輸入。

grep "hello" file.txt | wc -l

在file.txt中搜索包含有”hello”的行并計算其行數(shù)。

在這里grep命令的輸出作為wc命令的輸入。當然您可以使用多個命令。

重定向:將命令的結(jié)果輸出到文件,而不是標準輸出(屏幕)。

寫入文件并覆蓋舊文件

加到文件的尾部,保留舊文件內(nèi)容。

反短斜線

使用反短斜線可以將一個命令的輸出作為另外一個命令的一個命令行參數(shù)。

命令: find . -mtime -1 -type f -print 用來查找過去24小時(-mtime –2則表示過去48小時)內(nèi)修改過的文件。如果您想將所有查找到的文件打一個包,則可以使用以下腳本:

#!/bin/sh

The ticks are backticks (`) not normal quotes (‘’):

tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f

-print`

4.3 流程控制

“if” 表達式 如果條件為真則執(zhí)行then后面的部分:

if ....; then

....

elif ....; then

....

else

....

fi

大多數(shù)情況下,可以使用測試命令來對條件進行測試。比如可以比較字符串、判斷文件是否存在及是否可讀等等…通常用" [ ] "來表示條件測試。注意這里的空格很重要。要確保方括號的空格。

[ -f "somefile" ] :判斷是否是一個文件

[ -x "/bin/ls" ] :判斷/bin/ls是否存在并有可執(zhí)行權(quán)限

[ -n "$var" ] :判斷$var變量是否有值

[ "$a" = "$b" ] :判斷$a和$b是否相等

4.4 執(zhí)行腳本 Linux下的sh文件默認是有執(zhí)行權(quán)限的。

我們可以用命令:ls -l file_name來查看用戶對文件的權(quán)限。如果沒有執(zhí)行權(quán)限,可以執(zhí)行以下命令添加:chmod +x file_name 。然后可以通過運行:sh XX.sh這樣的命令來運行腳本。當然不同的系統(tǒng)可能不完全相同,需要根據(jù)實際情況來。例如有的Linux下是./XX.sh就可以運行。

概括地來說,shell對shell腳本的調(diào)用可以采用3種方式:

(1)一種是將文件名作為shell命令的參數(shù),其調(diào)用格式為:

$ Bash script_file

當要被執(zhí)行的腳本文件沒有可執(zhí)行權(quán)限時,只能使用這種調(diào)用方式。

(2)另一種調(diào)用的方法是先將腳本文件的訪問權(quán)限更改為可執(zhí)行,以便該文件可以作為執(zhí)行文件調(diào)用。

具體的方法是:$chmod +x script_file

$PATH=$PATH:$PWD

$script_file

(3)當執(zhí)行一個腳本文件時,Shell就產(chǎn)生了一個Shell(即一個子進程)去執(zhí)行文件中的命令。因此,腳本文件的變量值不能傳遞到當期Shell(即父進程)。為了使腳本文件中的變量值傳遞到當前Shell,必須在命令文件名前面加“.”。即:

$./script_file

“.”命令的功能是在當前shell中執(zhí)行腳本文件中的命令,而不是產(chǎn)生一個子shell執(zhí)行命令文件中的命令。

當你在腳本的最頂部包含“#!/bin/bash”行時,系統(tǒng)知道你想使用 bash 作為腳本的解釋器。因此,你現(xiàn)在可以直接運行 hello.sh 腳本,而無需在其前面加上 bash。

使用 #!/bin/bash 表示該腳本是 bash shell 腳本,無論系統(tǒng)上正在使用什么 shell,都應(yīng)該使用 bash 作為解釋器運行。如果你使用的是 zsh 特定的語法,你可以通過添加 #! /bin/zsh 作為腳本的第一行。

#! 和 /bin/bash 之間的空格無關(guān)緊要。你也可以使用 #!/bin/bash。

4.5 參數(shù)詳解

像上面這樣的腳本程序只能執(zhí)行一些預(yù)先定義好的功能,太過死板。為了讓 Shell 腳本程序更好地滿足用戶的一些實時需求,以便靈活完成工作,必須要讓腳本程序能夠像之前執(zhí)行命令時那樣,接收用戶輸入的參數(shù)。

Linux 系統(tǒng)中的 Shell 腳本語言內(nèi)設(shè)了一些用于接收參數(shù)的變量,變量之間可以使用空格間隔。例如:

$0 對應(yīng)的是當前 Shell 腳本程序的名稱
$# 對應(yīng)的是總共有幾個參數(shù)(參數(shù)個數(shù))
$* 對應(yīng)的是所有位置的參數(shù)值
$? 對應(yīng)的是顯示上一次命令的執(zhí)行返回值
$N對應(yīng)的是第 N 個位置的參數(shù)值
例子:

[root@wz lucky]# cat exam.sh
#!/bin/bash
echo "sh name: $0"
echo "total parameters $#, is $*"
echo "the first parm is $1, the fifth parm is $5"

[root@wz lucky]# bash exam.sh 1 2 3 4 5 6
sh name: exam.sh
total parameters 6, is 1 2 3 4 5 6
the first parm is 1, the fifth parm is 5

1. 條件測試語句

系統(tǒng)在執(zhí)行mkdir命令時會判斷用戶輸入的信息,即判斷用戶指定的文件夾名稱是否已經(jīng)存在,如果存在則提示報錯;反之則自動創(chuàng)建。Shell 腳本中的條件測試語法可以判斷表達式是否成立,若條件成立則返回數(shù)字 0,否則便返回其他隨機數(shù)值。 條件測試語法的執(zhí)行格式如下:

[ condition ]

注意:條件表達式兩邊均應(yīng)有一個空格。

按照測試對象來劃分,條件測試語句可以分為 4 種:

文件測試語句;
邏輯測試語句;
整數(shù)值比較語句;
字符串比較語句。
文件測試語句

文件測試即使用指定條件來判斷文件是否存在或權(quán)限是否滿足等情況的運算符。 具體的參數(shù)如下表:

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

使用文件測試語句來判斷/etc/fstab是否為一個目錄類型的文件,然后通過 Shell 解釋 器的內(nèi)設(shè)$?變量顯示上一條命令執(zhí)行后的返回值。如果返回值為 0,則目錄存在;如果返回值為非零的值,則意味著目錄不存在:

[root@wz lucky]# [ -d /etc/fstab ]
[root@wz lucky]# echo $?
127
使用文件測試語句來判斷/etc/fstab是否為一般文件,如果返回值為 0,則代表文件存在,且為一般文件:

[root@wz lucky]# [ -f /etc/fstab ]
[root@wz lucky]# echo $?
0

2. 邏輯測試語句

邏輯語句用于對測試結(jié)果進行邏輯分析,根據(jù)測試結(jié)果可實現(xiàn)不同的效果。例如在 Shell 終端中邏輯“與”的運算符號是&&,它表示當前面的命令執(zhí)行成功后才會執(zhí)行它后面的命令, 因此可以用來判斷/dev/cdrom文件是否存在,若存在則輸出Exist字樣。

[root@wz lucky]# [ -e /dev/cdrom ] && echo "Exist"
Exist
除了邏輯“與”外,還有邏輯“或”,它在 Linux 系統(tǒng)中的運算符號為||,表示當前面的命令執(zhí)行失敗后才會執(zhí)行它后面的命令,因此可以用來結(jié)合系統(tǒng)環(huán)境變量USER來判斷當前登錄的用戶是否為非管理員身份:

[root@wz lucky]# [ $USER = root ] || echo "user"
[root@wz lucky]# su lucky
[lucky@wz ~]$ [ $USER = root ] || echo "user"
user
第三種邏輯語句是“非”,在 Linux 系統(tǒng)中的運算符號是一個嘆號(!),它表示把條件測試中的判斷結(jié)果取相反值。也就是說,如果原本測試的結(jié)果是正確的,則將其變成錯誤的; 原本測試錯誤的結(jié)果則將其變成正確的。

[lucky@wz ~]$ [ ! $USER = root ] || echo "user"
[lucky@wz ~]$ [ $USER = root ] || echo "user"
user

看個復(fù)雜的例子:

[lucky@wz ~]$ [ ! $USER = root ] && echo "user" || echo "root"
user
[root@wz ~]# [ ! $USER = root ] && echo "user" || echo "root"
root
先判斷當前登錄用戶的USER變量名稱是否等于root,然后用邏輯運算符“非”進行取反操作,效果就變成了判斷當前登錄的用戶是否為非管理員用戶了。最后若條件成立則會根據(jù)邏輯“與”運算符輸出user字樣;或條件不滿足則會通過邏輯“或”運算符輸出root字樣,而如果前面的&&不成立才會執(zhí)行后面的||符號。

3. 整數(shù)值比較語句

整數(shù)比較運算符僅是對數(shù)字的操作,不能將數(shù)字與字符串、文件等內(nèi)容一起操作,而且不能想當然地使用日常生活中的等號、大于號、小于號等來判斷。因為等號與賦值命令符沖突,大于號和小于號分別與輸出重定向命令符和輸入重定向命令符沖突。因此一定要使用規(guī)范的整數(shù)比較運算符來進行操作。可用的整數(shù)比較運算符如表所示:

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

記法:

-eq:equal
-ne:not equal
-gt:greater than
-lt:lower than
-le:lower equal
-ge:greater than
例子:

[lucky@wz ~]$ [ 10 -gt 10 ]
[lucky@wz ~]$ echo $?
1
[lucky@wz ~]$ [ 10 -eq 10 ]
[lucky@wz ~]$ echo $?
0
free 命令可以用來獲取當前系統(tǒng)正在使用及可用的內(nèi)存量信息。 接下來先使用 free -m 命令查看內(nèi)存使用量情況(單位為 MB),然后通過 grep Mem:命令過濾出剩余內(nèi)存量的行,再用 awk '{print $4}'命令只保留第四列,最后用FreeMem=語句``的方式把語句內(nèi)執(zhí)行的結(jié)果賦值給變量。

[lucky@wz ~]$ free -m
total used free shared buff/cache available
Mem: 1806 1204 118 7 483 435
Swap: 2047 60 1987
[lucky@wz ~]$ free -m | grep Mem
Mem: 1806 1204 117 7 483 434
[lucky@wz ~]$ free -m | grep Mem | awk '{print $4}'
117
[lucky@wz ~]$ FreeMem=free -m | grep Mem | awk '{print $4}'
[lucky@wz ~]$ echo $FreeMem
104
使用整數(shù)運算符來判斷內(nèi)存可用量的值是否小于 1024,若小于則提示“Insufficient Memory”的字樣:

[lucky@wz ~]$ [ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
Insufficient Memory

4. 字符串比較語句

字符串比較語句用于判斷測試字符串是否為空值,或兩個字符串是否相同。它經(jīng)常用來判斷某個變量是否未被定義(即內(nèi)容為空值)。字符串比較中常見的運算符如下表所示:

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

通過判斷 String變量是否為空值,進而判斷是否定義了這個變量:

[lucky@wz ~]$ [ -z $String ]
[lucky@wz ~]$ echo $?
0
當用于保存當前語系的環(huán)境變量值LANG不是英語(en.US)時,則會滿足邏輯測試條件并輸出“Not en.US”的字樣:

[lucky@wz ~]$ echo $LANG
en_US.UTF-8
[lucky@wz ~]$ [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US

5. 流程控制語句
5.1 if 條件測試語句

if條件測試語句可以讓腳本根據(jù)實際情況自動執(zhí)行相應(yīng)的命令。從技術(shù)角度來講,if 語句分為單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu),其復(fù)雜度隨著靈活度一起逐級上升。

5.2 單分支結(jié)構(gòu)

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

if condition
then ...
fi
例子:使用單分支的if 條件語句來判斷/media/cdrom 目錄是否存在,若存在就結(jié)束條件判斷和整個 Shell 腳本,反之則去創(chuàng)建這個目錄:

[lucky@wz ~]$ cat mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi

5.3 雙分支結(jié)構(gòu)

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

if condition
then ...
else ...
fi
例子:使用雙分支的 if 條件語句來驗證某臺主機是否在線,然后根據(jù)返回值的結(jié)果,要么顯示主機在線信息,要么顯示主機不在線信息。這里的腳本主要使用ping 命令來測試與對方主機的網(wǎng)絡(luò)聯(lián)通性,而 Linux 系統(tǒng)中的ping命令不像 Windows 一樣嘗試 4 次就結(jié)束,因此為了避免用戶等待時間過長,需要通過-c 參數(shù)來規(guī)定嘗試的次數(shù),并使用-i參數(shù)定義每個數(shù)據(jù)包的發(fā)送間隔,以及使用-W參數(shù)定義等待超時時間。

[lucky@wz ~]$ cat 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
/dev/null:黑洞文件

5.4 多分支結(jié)構(gòu)

if 條件語句的多分支結(jié)構(gòu)由if、then、else、elif、fi 關(guān)鍵詞組成,它進行多次條件匹配判斷,這多次判斷中的任何一項在匹配成功后都會執(zhí)行相應(yīng)的預(yù)設(shè)命令,相當于口語的“如果…那么…如果…那么…”。if條件語句的多分支結(jié)構(gòu)是工作中最常使用的一種條件判斷結(jié)構(gòu),盡管相對復(fù)雜但是更加靈活,語法格式如下:

if condition1
then ...
elif condition2
then ...
else ...
fi
例子:判斷用戶輸入的分數(shù)在哪個成績區(qū)間內(nèi),然后輸出如 Excellent、Pass、Fail等提示信息。在 Linux 系統(tǒng)中,read是用來讀取用戶輸入信息的命令,能夠把接收到的用戶輸入信息賦值給后面的指定變量,-p參數(shù)用于向用戶顯示一定的提示信息。

[lucky@wz ~]$ cat chkscore.sh
#!/bin/bash
read -p "Enter your score(0 - 100):" GRADE
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

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

for的語法格式為:

for x in xx
do ...
done
例子:使用 for循環(huán)語句從列表文件中讀取多個用戶名,然后為其逐一創(chuàng)建用戶賬戶并設(shè)置密碼。首先創(chuàng)建用戶名稱的列表文件users.txt,每個用戶名稱單獨一行。

[lucky@wz ~]$ cat users.txt
andy
barry
carl
duke
eric
george
在腳本中使用 read 命令讀取用戶輸入的密碼值,然后賦值給 PASSWD 變量,并通過-p參數(shù)向用戶顯示一段提示信息,告訴用戶正在輸入的內(nèi)容即將作為賬戶密碼。在執(zhí)行該腳本后,會自動使用從列表文件 users.txt中獲取到所有的用戶名稱,然后逐一使用“id 用戶名”命令查看用戶的信息,并使用$?判斷這條命令是否執(zhí)行成功,也就是判斷該用戶是否已經(jīng)存在。

[root@wz lucky]# cat Exam.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 腳本 Exam.sh,在輸入為賬戶設(shè)定的密碼后將由腳本自 動檢查并創(chuàng)建這些賬戶。由于已經(jīng)將多余的信息通過輸出重定向符轉(zhuǎn)移到了/dev/null 黑洞文件中,因此在正常情況下屏幕窗口除了“用戶賬戶創(chuàng)建成功”(Create success)的提示后不會有其他內(nèi)容。

[root@wz lucky]# tail -6 /etc/passwd
andy:x:1001:1001::/home/andy:/bin/bash
barry:x:1002:1002::/home/barry:/bin/bash
carl:x:1003:1003::/home/carl:/bin/bash
duke:x:1004:1004::/home/duke:/bin/bash
eric:x:1005:1005::/home/eric:/bin/bash
george:x:1006:1006::/home/george:/bin/bash
讓腳本從文本中自動讀取主機列表,然后自動逐個測試這些主機是否在線。 首先創(chuàng)建一個主機列表文件 ipadds.txt:

lucky@LAPTOP-G2DIO3FV:~$ cat ipadds.txt
www.baidu.com
www.google.com
雙分支 if條件語句與 for循環(huán)語句相結(jié)合,讓腳本從主機列表文件 ipadds.txt中自動讀取 IP 地址并將其賦值給 HLIST變量,從而通過判斷 ping命令執(zhí) 行后的返回值來逐個測試主機是否在線。腳本中出現(xiàn)的$是一種完全類似于轉(zhuǎn)義字符中反引號命令的 Shell 操作符,效果同樣是執(zhí)行括號或雙引號括起來的字符串中的命令。

[lucky@wz ~]$ cat CheckHosts.sh
#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ]
then echo "Host $IP is On-line"
else echo "Host $IP is Off-line"
fi
done
[lucky@wz ~]$ bash CheckHosts.sh
Host www.baidu.com is On-line
Host www.google.com is Off-line
while 條件循環(huán)語句
while條件循環(huán)語句是一種讓腳本根據(jù)某些條件來重復(fù)執(zhí)行命令的語句,它的循環(huán)結(jié)構(gòu)往往在執(zhí)行前并不確定最終執(zhí)行的次數(shù),完全不同于 for循環(huán)語句中有目標、有范圍的使用場景。 while循環(huán)語句通過判斷條件測試的真假來決定是否繼續(xù)執(zhí)行命令,若條件為真就繼續(xù)執(zhí)行, 為假就結(jié)束循環(huán)。
while語句的語法格式如下:

while condition
do ...
done
經(jīng)典的猜數(shù)字:

lucky@LAPTOP-G2DIO3FV:~$ cat Guess.sh
#!bin/bash
PRICE=expr $RANDOM % 1000
TIMES=0
echo "商品實際價格為0-999之間,猜猜看是多少?"
while true
do
read -p "請輸入您猜測的價格數(shù)目:" INT
let TIMES++
if [ $INT -eq $PRICE ]
then
echo "恭喜您答對了,實際的價格是 $PRICE"
echo "您總共猜測了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ]
then
echo "太高了"
else
echo "太低了"
fi
done
$RANDOM 變量來調(diào)取出一個隨機的數(shù)值(范圍為 0~32767)
將這個隨機數(shù)對 1000 進行取余操作,并使用 expr命令取得其結(jié)果,
再用這個數(shù)值與用戶通過 read命令輸入的數(shù)值進行比較判斷。這個判斷語句分為三種情況,分別是判斷用戶輸入的數(shù)值是等于、 大于還是小于使用 expr命令取得的數(shù)值。
case 條件測試語句
case條件測試語句和 switch語句的功能非常相似!case語句是在多個范圍內(nèi)匹配數(shù)據(jù),若匹配成功則執(zhí)行相關(guān)命令并結(jié)束整個條件測試;而如果數(shù)據(jù)不在所列出的范圍內(nèi), 則會去執(zhí)行星號(*)中所定義的默認命令。case語句的語法結(jié)構(gòu)如下

case 變量值 in
模式1)
命令序列1
;;
模式1)
命令序列1
;;
*)
默認命令序列
esac
提示用戶輸入一個字符并將其賦值給變量 KEY, 然后根據(jù)變量 KEY的值向用戶顯示其值是字母、數(shù)字還是其他字符。

#!/bin/bash
read -p "please input a char: " KEY
case $KEY in
[a-z]|[A-Z])
echo "character!"
;;
[0-9])
echo "number!"
;;
*)
echo "space or others"
esac
計劃任務(wù)服務(wù)程序
計劃任務(wù)分為一次性計劃任務(wù)與長期性計劃任務(wù):

一次性計劃任務(wù):今晚 11 點 30 分開啟網(wǎng)站服務(wù)。
長期性計劃任務(wù):每周一的凌晨 3 點 25 分把/home/wwwroot 目錄打包備份為 backup.tar.gz。
一次性計劃任務(wù)只執(zhí)行一次,一般用于滿足臨時的工作需求。

用 at命令實現(xiàn)這種功能,只需要寫成“at 時間”的形式就可以。
查看已設(shè)置好但還未執(zhí)行的一次性計劃任務(wù),可以使用“at -l”命令;
要想將其刪除,可以用“atrm 任務(wù)序號”。
在使用 at命令來設(shè)置一次性計劃任務(wù)時,默認采用的是交互式方法。例如,使用下述命令將系統(tǒng)設(shè)置為在今晚 23:30 分自動重啟網(wǎng)站服務(wù)。

lucky@LAPTOP-G2DIO3FV:~$ at 23:30
at > systemctl restart httpd
at > 此處請同時按下 Ctrl + D 組合鍵來結(jié)束編寫計劃任務(wù)
job 3 at Mon Apr 27 23:30:00 2017

利用管道符,讓 at命令接收前面 echo命令的輸出信息,以達到通過非交互式的方式創(chuàng)建計劃一次性任務(wù)的目的。

lucky@LAPTOP-G2DIO3FV:~$ echo “systemctl restart httpd” | at 23:30
job 4 at Mon Apr 27 23:30:00 2017

使用下面的命令刪除其中一個:

lucky@LAPTOP-G2DIO3FV:~$ at -l
3 Mon Apr 27 23:30:00 2017 a root
4 Mon Apr 27 23:30:00 2017 a root
lucky@LAPTOP-G2DIO3FV:~$ atrm 3
lucky@LAPTOP-G2DIO3FV:~$ at -l
4 Mon Apr 27 23:30:00 2017 a root

如果我們希望 Linux 系統(tǒng)能夠周期性地、有規(guī)律地執(zhí)行某些具體的任務(wù),那么 Linux 系統(tǒng)中默認啟用的 crond服務(wù)簡直再適合不過了。創(chuàng)建、編輯計劃任務(wù)的命令為“crontab -e”,查看當前計劃任務(wù)的命令為“crontab -l”,刪除某條計劃任務(wù)的命令為“crontab -r”。另外,如果您是以管理員的身份登錄的系統(tǒng),還可以在 crontab命令中加上-u參數(shù)來編輯他人的計劃任務(wù)。

crond服務(wù)設(shè)置任務(wù)的參數(shù)格式:分、時、日、月、星期、命令。 如果有些字段沒有設(shè)置,則需要使用星號占位。

假設(shè)在每周一、三、五的凌晨 3 點 25 分,都需要使用 tar命令把某個網(wǎng)站的數(shù)據(jù)目錄進行打包處理,使其作為一個備份文件。我們可以使用 crontab -e命令來創(chuàng)建計劃任務(wù)。為自己創(chuàng)建計劃任務(wù)無需使用-u參數(shù),具體的實現(xiàn)效果的參數(shù)如 crontab -l 命令結(jié)果所示:

lucky@LAPTOP-G2DIO3FV:~$ crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
lucky@LAPTOP-G2DIO3FV:~$ crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

逗號表示多個時間段,例如“8,9,12”表示 8 月、9 月 和 12 月。
減號表示一段連續(xù)的時間周期(例如字段“日”的取值為“12-15”, 則表示每月的 12~15 日)。
除號表示執(zhí)行任務(wù)的間隔時間(例如“/2”表示每隔 2 分鐘執(zhí)行一次任務(wù))之外。
如果在 crond服務(wù)中需要同時包含多條計劃任務(wù)的命令語句,應(yīng)每行僅寫一條。例如我們再添加一條計劃任務(wù),它的功能是每周一至周五的凌晨 1 點鐘自動清空/tmp目錄內(nèi)的所有文件。

尤其需要注意的是,在 crond服務(wù)的計劃任務(wù)參數(shù)中,所有命令一定要用絕對路徑的方式來寫,如果不知道絕對路徑,請用 whereis命令進行查詢,rm命令路徑為下面輸出信息中加粗部分。

lucky@LAPTOP-G2DIO3FV:~$ whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
lucky@LAPTOP-G2DIO3FV:~$ crontab -e
crontab: installing new crontab
lucky@LAPTOP-G2DIO3FV:~$ crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
注意:

在 crond服務(wù)的配置參數(shù)中,可以像 Shell 腳本那樣以#號開頭寫上注釋信息,這樣在日后回顧這段命令代碼時可以快速了解其功能、需求以及編寫人員等重要信息。
計劃任務(wù)中的“分”字段必須有數(shù)值,絕對不能為空或是*號,而“日”和“星期” 字段不能同時使用,否則就會發(fā)生沖突。

4、將 shell 腳本添加到 PATH

(以便它可以從任何目錄運行)

前面使用 ./scripts.sh 來運行腳本;如果省略前導(dǎo) ./;./ 代表當前目錄

Bash 認為你正在嘗試運行名為 scripts.sh 的命令。當你在終端上運行任何命令時,shell 就在存儲在 PATH 變量中的一組目錄中查找該命令。

linux編寫腳本之快速入門

若顯示權(quán)限不足,賦予權(quán)限

chmod u+x xxx.sh

linux編寫腳本之快速入門

問題原因:
由于windows系統(tǒng)下?lián)Q行符為 \r\n,linux下?lián)Q行符為 \n,所以導(dǎo)致在windows下編寫的文件會比linux下多回車符號 \r。

解決辦法:
只需要去掉多余的 \r 回車符 即可**。**操作辦法可以用sed命令進行全局替換,

sed 's/\r//' -i scripts.sh

linux編寫腳本之快速入門

可以使用 echo 查看該 PATH 變量的內(nèi)容:echo $PATH

linux編寫腳本之快速入門

冒號字符 (?? 分隔每次運行命令時 shell 掃描的每個目錄的路徑。

像 echo、cat 等 Linux 命令可以從任何地方運行,因為它們的可執(zhí)行文件存儲在 bin 目錄中。bin 目錄包含在 PATH 中。當你運行命令時,系統(tǒng)會檢查 PATH 以查找它應(yīng)該尋找的所有可能位置,以找到該命令的可執(zhí)行文件。

如果你想從任何地方運行你的 bash 腳本,就像它是一個常規(guī)的 Linux 命令,需要將你的 shell 腳本的位置添加到 PATH 變量中。

首先,獲取腳本目錄的位置(假設(shè)在同一目錄中),使用 PWD 命令:
pwd

使用 export 命令將腳本目錄添加到 PATH 變量。

export PATH=$PATH:/scripts

linux編寫腳本之快速入門

至此我們的腳本學(xué)習(xí)就結(jié)束了

參考文章:https://blog.csdn.net/m0_46278037/article/details/120457468

? https://blog.csdn.net/m0_72429728/article/details/127070148文章來源地址http://www.zghlxwxcb.cn/news/detail-494142.html

到了這里,關(guān)于linux編寫腳本之快速入門的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux shell腳本編寫

    Linux shell腳本編寫

    一、常用shell腳本指令 echo: 輸出指定的文本或變量值到標準輸出。 read: 從標準輸入讀取用戶輸入,并將其保存到指定的變量中。 if: 執(zhí)行條件語句,如果滿足指定條件則執(zhí)行特定操作,否則執(zhí)行其他操作。 for: 循環(huán)執(zhí)行特定操作,每次迭代更新變量值。 while: 循環(huán)執(zhí)行

    2024年02月16日
    瀏覽(28)
  • 【Linux】編寫一個 shell 腳本&執(zhí)行

    在Linux中編寫和執(zhí)行腳本相對簡單。下面是一個基本的步驟指南,幫助你創(chuàng)建一個簡單的bash腳本并運行它: 1. 創(chuàng)建腳本文件 首先,你需要使用文本編輯器創(chuàng)建一個新的文件。這個文件通常會有 .sh 的擴展名,以表明它是一個shell腳本。例如,你可以創(chuàng)建一個名為 myscript.sh 的文

    2024年04月26日
    瀏覽(24)
  • Linux:編寫編譯腳本Makefile文件

    Linux:編寫編譯腳本Makefile文件

    一、生成可執(zhí)行文件 1、一個源文件編譯 本例子主要區(qū)別.c及.cpp文件及編譯該文件時使用的編譯鏈。 1).c文件 2) .cpp文件 經(jīng)過以上測試,總結(jié)如下: 以.cpp為后綴的文件,為c++代碼。代碼最好使用C++語言。也可以使用c語言。 a 代碼使用c++語言,編譯時必須要用g++,不能使用

    2024年02月11日
    瀏覽(17)
  • c#編寫單擊游戲快速入門

    1.4??創(chuàng)建并編輯C#腳本在Unity中,可以使用3種方式創(chuàng)建C#腳本文件,且新創(chuàng)建的腳本文件會顯示在Project視圖下,如下創(chuàng)建并編輯C#腳本C#游戲開發(fā)快速入門大學(xué)霸: q??在Unity中,單擊Assets|Create|C# Script命令; q??在Project視圖里,單擊Create|C# Script命令; q??在Project視圖里,單

    2024年02月16日
    瀏覽(20)
  • Unity入門(三)——VS Code配置與C#腳本編寫

    Unity入門(三)——VS Code配置與C#腳本編寫

    這回我們將使用VS Code編寫我們的第一個程序并在Unity運行。 書接前文,在項目中點開“Exit-Preferences-External Tools”,確保外部腳本編輯器選擇的是VS Code 然后回到項目,在下方的“Project”中右鍵空白處,創(chuàng)建一個C#腳本文件 此時可以在右側(cè)看到該腳本的內(nèi)容,此時需要檢查類

    2024年02月07日
    瀏覽(25)
  • linux中編寫.sh腳本并賦權(quán)限問題

    以項目啟動、重啟、終止腳本為例: 步驟: 首先 vi start.sh 、 vi restart.sh 、 vi stop.sh 或者使用 vim 編輯器; 編輯內(nèi)容: 啟動: vi start.sh 重啟: vi restart.sh 關(guān)閉: vi stop.sh 保存并退出; chmod +x start.sh restart.sh stop.sh 賦予可執(zhí)行權(quán)限; 輸入 ./start.sh 、 ./restart.sh 、 ./stop.sh 執(zhí)行腳

    2024年02月04日
    瀏覽(18)
  • Antlr4 快速入門 - 編寫語法解析器

    Antlr4 快速入門 - 編寫語法解析器

    Antlr全稱(ANother Tool for Language Recognition),Antlr4是一款強大的語法分析器生成工具,推特,Haddop,Oracle等各大知名公司在用到了Antlr來構(gòu)建自己的語言處理類項目。 一門語言的正式描述稱為語法(grammar),Antlr可以為語言生成一個詞法分析器,并且自動建立語法分析樹,也能自動生

    2024年02月14日
    瀏覽(20)
  • 【運維工程師學(xué)習(xí)三】Linux中Shell腳本編寫

    【運維工程師學(xué)習(xí)三】Linux中Shell腳本編寫

    Shell程序有很多, 如 Korn shell(ksh)、Bourne Again shell(bash)、C shell(包括csh與tcsh) 等等, 各主要操作系統(tǒng)下缺省的shell: AIX下是 Korn Shell Solaris缺省的是 Bourne shell FreeBSD缺省的是 C shell HP-UX缺省的是 POSIX shell Linux缺省的是 Bourne Again shell 但這種在命令行中的命令是即時輸出結(jié)果的,不

    2024年02月11日
    瀏覽(20)
  • Linux下Python腳本的編寫解析fio測試log(四)

    Linux下Python腳本的編寫解析fio測試log(四)

    在我們平常的測試盤的過程中,fio是一款業(yè)界最為通用的工具,通過Fio可以只知道一個盤具體的帶寬,iops,延遲等等.比如下面這段fio的log 這里邊需要拿出log里的一些參數(shù) 做成表格 如下: 下面說下如何用Python解析log并做成表格 1 同樣是用到Python中文件函數(shù)open,調(diào)用四個模塊sy

    2024年02月08日
    瀏覽(15)
  • C語言,Linux,靜態(tài)庫編寫方法,makefile與shell腳本的關(guān)系。

    C語言,Linux,靜態(tài)庫編寫方法,makefile與shell腳本的關(guān)系。

    靜態(tài)庫編寫: 編寫.o文件 gcc -c( 小寫) seqlist.c(需要和頭文件、main.c文件在同一文件目錄下) libs.a- 去掉lib與.a剩下的為庫的名稱‘s’。 -ls 是指庫名為s。 -L 庫的路徑。 makefile文件編寫: 這個是編譯后的文件,app文件為編譯后的二進制文件。? ? ? makefile與shell腳本關(guān)系 shell?腳

    2024年02月12日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包