衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux中shell腳本編程

xCb1_yikoulinux ? 來源:一口Linux ? 作者:一口Linux ? 2022-04-18 11:58 ? 次閱讀

一、變量

1. shell腳本基礎知識

編譯型語言:如 c語言解釋型語言:shell 腳本

shell腳本的本質:shell命令的有序集合

2.shell 編程的基本過程

基本過程分為三步:

  1. 建立shell文件:包含任意多行操作系統命令或shell命令的文本文件。——xx.sh
  2. 賦予shell文件執行權限,==用chmod命令修改權限==。
  3. 執行shell文件,直接在命令行上調用shell程序

示例:

  1. 建立shell文件 prog1.sh
data
  1. 賦予shell文件執行權限 (初始文本文件無執行權限)
chmod740prog1.sh
#或者
chmodu+xprog1.sh
  1. 執行shell文件
prog1.sh
#結果為
prog1.sh :notfound

原因是:shell在標準搜索路徑中找不到prog1.sh4.正確的執行shell文件

./prog1.sh
#結果為
20091216日星期二145257CST

3. shell變量

shell允許用戶建立變量存儲數據,但不支持數據類型(整型,字符,浮點型),將任何賦給變量的值都解釋為一串字符Variable = value

  • count = 1
  • echo $ count
  • DATE = data
  • echo $ DATE
bbe20d0a-beca-11ec-9e50-dac502259ad0.png在這里插入圖片描述

==注意幾點:==

  1. 變量沒有類型

  2. =號兩邊不能加空格

  3. 變量必須是大寫

  4. 賦值的時候要用``框起來

Bourne shell有如下四種變量:

  • 用戶自定義變量

  1. 在shell編程中通常使用全大寫變量:COUNT=1
  2. 變量的調用,在變量前加$:echo $HOME
  3. Linux shell / bash 從右向左賦值:Y=y、X=$Y、echo $X 、y
  4. 使用unset命令刪除變量的賦值:Z=hello、echo $Z、hello、unset Z、echo$Z
  • 位置變量及命令行參數

  1. $0 與鍵入的命令行一樣,包含腳本文件名
  2. $1,$2....$9 分別包含第一個到第九個命令行參數。
  3. $# 包含命令行參數的個數
  4. $@ 包含所有命令行參數:$1,$2,...$9
  5. $?包含前一個命令的退出狀態
  6. $* 包含所有命令行參數:$1,$2,....$9
  7. $$ 包含正在執行進程的ID號

bc0696f2-beca-11ec-9e50-dac502259ad0.pngbc1c1108-beca-11ec-9e50-dac502259ad0.png

  • 預定義變量

bc3dc0d2-beca-11ec-9e50-dac502259ad0.pngbc4fce8a-beca-11ec-9e50-dac502259ad0.pngbc64431a-beca-11ec-9e50-dac502259ad0.pngbc7fdbfc-beca-11ec-9e50-dac502259ad0.png

bca78422-beca-11ec-9e50-dac502259ad0.png

必須在兩位數邊寫上 { } ,才能正常值一一樣。
bcbebffc-beca-11ec-9e50-dac502259ad0.png

  • 環境變量
  1. HOME:/etc/passwd文件中列出的用戶目錄
  2. IFS: Internal Field Separator , 默認為空格,tab及換行符
  3. PATH:shell搜索路徑
  4. PS1,PS2:默認提示符($)及換行提示符(>)
  5. TERM:終端類型,常用的有vt100,ansi,vt200,xterm等。

二、shell 功能語句

shell 程序由零或多條shell語句構成。shell語句包括三類:說明性語句,功能性語句和結構性語句。

**說明性語句 ** 以 # 號開始到該行結束,不被解釋執行功能性語句 任意的shell命令,用戶程序或其他shell程序結構性語句 條件測試語句,多路分支語句,循環語句,循環控制語句等。

#!/bin/sh
#
#本程序說明
#
command_1
command_2#command_2的語句說明
....

常用功能性語句(命令)

==read== 從標準輸入讀入一行,并賦值給后面的變量,其語法為:

readvar

把讀入的數據全部賦給var

readvar1var2var3

把讀入行中的第一個單詞(word)賦給var1 ,第二個單詞賦給var2,.....把其余所有的詞賦給最后一個變量。如果執行read語句時標準輸入無數據,則程序在此停留等候,直到數據的到來或被終止運行。

#!/bin/bash
echo"inputanumber:"
readNUM
echo$NUM
bcd1ec62-beca-11ec-9e50-dac502259ad0.png在這里插入圖片描述
#!/bin/bash
echo"inputyearmonthday:"
readYMD
echo"Todayis$Y-$M-$D"

bcf34a06-beca-11ec-9e50-dac502259ad0.png

==expr命令:==算術運算命令expr主要用于進行簡單的整數運算,包括加(+)、減(-)、乘(*)和求模(%)等操作。例如

$expr12+5*3
27
$expr3-8/2
-1
$num=9
$sum=`expr$num*6`
$echo$sum
54

bd0818be-beca-11ec-9e50-dac502259ad0.pngbd1db5a2-beca-11ec-9e50-dac502259ad0.png

!!運算符間用空格分開!!

測試語句

==test語句==

test語句可測試三種對象:

字符串 / 整數 / 文件屬性

每種測試對象都有若干測試操作符例如:

test"$answer"="yes"
#變量answer的值是否為字符串yes

test$num-eq18
#變量num的值是否為整數18

test-dtmp
#測試tmp是否為一個目錄名

字符串測試:

s1 = s2 測試兩個字符串的內容是否完全一樣
s1 != s2 測試兩個字符串的內容是否有差異
-z s1 測試s1 字符串的長度是否為0
-n s1 測試s1 字符串的長度是否不為0

整數測試:

a - eq b 測試a 與 b是否相等
a - ne b 測試a 與 b是否不相等
a - gt b 測試a 是否大于b
a - ge b 測試a 是否大于相等b
a - lt b 測試a 是否小于b
a - le b 測試a 是否小于等于b
#!/bin/bash

A="how"
B="hoW"
test$A=$B
echo$?//表示輸出前一個語句的結果
bd2f065e-beca-11ec-9e50-dac502259ad0.png在這里插入圖片描述
#!/bin/bash

A="how"
B="how"
test$A=$B
echo$?//表示輸出前一個語句的結果

bd44216a-beca-11ec-9e50-dac502259ad0.png

相等為0(真),不等為1(假)

#!/bin/bash

A="how"
B="hoW"
test$A=$B
echo$?//表示輸出前一個語句的結果

pwd
echo$?

lsfile
echo$?

bd64a08e-beca-11ec-9e50-dac502259ad0.png

最后ls file 沒有,所以結果為2

#!/bin/bash

A=99
B=88
test$A-ne$B
echo$?//表示輸出前一個語句的結果

test$A-gt$B
echo$?//表示輸出前一個語句的結果
bd8130f0-beca-11ec-9e50-dac502259ad0.png在這里插入圖片描述

三、shell 分支語句

1. 條件語句

==if ..then...fi==語法結構:

if表達式
then命令表
fi
  • 如果表達式為真,則執行命令表種的命令;否則退出if語句,即執行fi后面的語句
  • if和fi是條件語句的語句括號,必須成對使用;
  • 命令表中的命令可以是一條,也可以是若干條。
#!/bin/bash

if[$#-ne1]
then
echo"usage:$0filename"
exit
fi
if![-e$1]
then
echo"$1notexist"
exit
fi
if[-d$1]
then
echo"$1isadirextory"
fi

bda783b8-beca-11ec-9e50-dac502259ad0.png

if...then ..else..fi語句結構為:

if表達式
then命令表1
else命令表2
fi

如果表達式為真,則執行命令表1中的命令,在退出if語句;否則執行命令表2中的語句,在退出if語句。

注意:無論表達式是否為真,都有語句要執行

#!/bin/bash

if[$#-ne1]
then
echo"usage:$0filename"
exit
fi
if![-e$1]
then
echo"$1notexist"
exit
fi
if[-L$1]
then
echo"l"
elif[-d$1]
then
echo"-"
elif[-b$1]
then
echo"b"
else
echo"csp"
fi
bded84bc-beca-11ec-9e50-dac502259ad0.png在這里插入圖片描述

2. 多路分支語句

==case...esac==多路分支語句case用于多重條件測試,語法結構清晰自然,

case字符串變量in//case語句只能檢測字符串變量
模式1)
命令表1//各模擬中可用文件名元字符,以右括號結束
;;
模式2|模式3)
命令表2
;;//命令表以單獨的雙分號行結束,退出case語句
.....
模式n)
命令表n
;;//模式n常寫為字符*,表示所有其他模式
esac//最后一個雙分號行可以省略

判斷選擇——多路分支語句 示例1:

#!/bin/bash

echo-n"please choose (yes | no)?"
readR
case$Rin
yes|Yes|y|Y|YES)
echo"yes"
;;
no)
echo"no"
;;
*)
echo"wrong"
#;;
esac

be0b06a4-beca-11ec-9e50-dac502259ad0.png

判斷成績——多路分支語句 示例2:

#!/bin/bash

echo-n"please choose (yes | no)?"
readS
if[$S-lt0-o$S-gt100]
then
echo"noin[0-100]"
exit
fi

G=`expr$S/10`
case$Gin
9|10)
echo"$SA"
;;
6|7|8)
echo"$SB"
;;
*)
echo"$SC"
#;;
esac
be3c1582-beca-11ec-9e50-dac502259ad0.png在這里插入圖片描述

四、shell 循環語句

1. 循環語句for的用法

當循環次數已經知道或確定時候,使用for循環語句來多次執行一條或者一組命令,循環體由語句括號do和done來限定。

格式為:

for變量名in單詞表
do
命令表
done

變量依次取單詞表中的各個單詞,每取一次單詞,就執行一次循環體中的命令。循環次數由單詞數確定。命令表中的命令可以是一條,也可以是由分號或換行符分開的多條。如果單詞表是命令行上的所有位置參數時,可以在for

實例代碼:

#!/bin/bash

#forIin`ls/etc`
do
echo"$I"
done
be61c250-beca-11ec-9e50-dac502259ad0.png在這里插入圖片描述

==seq命令== :列出一系列的數字seq 起始數字 中間分量 終止分量

#!/bin/bash
forIin`seq1210`
do
echo"$I"
done

be77be84-beca-11ec-9e50-dac502259ad0.png示例:拷貝當前目錄下的所有文件到backup子目錄下。使用語法為:./prog5.sh[filename]

#Thestatementoffor....do...done
if[!-d$HOME/backup]
then
mkdir$HOME/backup
fi
flist=`ls`
forfilein$flist//flist的值是ls的執行結果即當前目錄下的文件名
do
if[$#=1]
then
if[$1=$file]//命令行上有一個參數時
then
echo"$filefound";exit
fi
else
cp$file$HOME/backup
echo"$filecopied"
fi
done
echo***BackupCompleted******

2. 循環語句while的用法

語法結構:

while命令或表達式
do
命令表
done

while語句首先測試其后的命令或表達式的值,如果為真,就執行一次循環體中的命令,然后再測試該命令或表達式的值,執行循環體,直到該命令或表達式為假時退出循環。

示例:

#!/bin/bash

I=0

while[$I-lt5]//-lt=<
do
I=`expr$I+1`
echo-n"inputscore:"
read$S

case`expr$S/10`in
9|10)
echo"A"
;;
6|7|8)
echo"B"
;;
*)
echo"C"
;;
esac
echo"$I"
done

3. 循環控制語句

==break 和 continue==

break n 則跳出n層;continue語句則馬上轉到最近的一層循環語句的下一輪循環上,continue n 則轉到最近n層循環語句的下一輪循環上。

用法:prog7 整數 整數 整數 ...參數個數不確定,范圍為1-10個 ,每個參數都是正整數。

示例:

#!/bin/bash

if[$#-ne5]
then
echo"argument5"
exit
fi

forI
do
if[`expr$I%2`-eq1]
then
echo"$I"
else
break
fi
done

若是break 的話 ,跳出整個循環。遇到偶數就跳出循環。be91ac18-beca-11ec-9e50-dac502259ad0.png

#!/bin/bash

if[$#-ne5]
then
echo"argument5"
exit
fi

forI
do
if[`expr$I%2`-eq1]
then
echo"$I"
else
continue
fi
done

若是continue的話 ,跳出當前循環。遇到偶數就跳出當前循環,繼續執行下面語句bea32a92-beca-11ec-9e50-dac502259ad0.png

五、shell 函數

1. shell函數調用

函數調用格式:

方式1:
value_name=`function_name[arg1arg2...]`

函數的所有標準輸出都傳遞給了主程序的變量

方式2:
function_name[arg1arg2...]
echo$?

獲取函數的返回狀態

獲取函數的返回狀態 ——示例:

grep_user()
{
R=`grep"$1"/etc/passwd|wc-l`
echo$R
return$R
}

echo-n"inputusername:"
readUSER
grep_user$USER
RET=$?
if[$USER-eq1]
then
echo"$USERexist"
else
echo"$USERnotexist"
fi

beb0b464-beca-11ec-9e50-dac502259ad0.png

若改為不返回值,用變量,函數的所有標準輸出都傳遞給了主程序的變量

grep_user()
{
R=`grep"$1"/etc/passwd|wc-l`
echo$R
}

echo-n"inputusername:"
readUSER
RET=`grep_user$USER`
echo"----return$RET-----"
if[$USER-eq1]
then
echo"$USERexist"
else
echo"$USERnotexist"
fi
beda10c0-beca-11ec-9e50-dac502259ad0.png在這里插入圖片描述

2. 函數變量作用域

  • 全局作用域:在腳本的其他任何地方都能夠訪問該變量
  • 局部作用域:只能在聲明變量的作用域內訪問
  • 聲明局部變量的格式:
    • c Local variable_name = value
grep_user()
{
B=200
A=100
}

grep_user
echo"end:$A-$B"

結果發現函數內的變量,竟然是全局變量
beee2e20-beca-11ec-9e50-dac502259ad0.png

如果我們要局部變量就 加一個local

grep_user()
{
B=200
localA=100
}

grep_user
echo"end:$A-$B"
bf1b65ac-beca-11ec-9e50-dac502259ad0.png在這里插入圖片描述

原文標題:Linux基礎-shell腳本編程

文章出處:【微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11342

    瀏覽量

    210273
  • 編程
    +關注

    關注

    88

    文章

    3637

    瀏覽量

    93934
  • Shell
    +關注

    關注

    1

    文章

    366

    瀏覽量

    23439

原文標題:Linux基礎-shell腳本編程

文章出處:【微信號:yikoulinux,微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux Shell腳本入門到實戰詳解

    Linux Shell腳本入門到實戰詳解
    發表于 02-17 15:03 ?658次閱讀

    嵌入式Linux入門(五、Shell腳本編程上:認識Shell腳本

    大家好,是矜辰所致,嵌入式 Linux入 門第五課,本課開始簡單學習一下 Shell 腳本編程
    的頭像 發表于 07-13 16:10 ?1718次閱讀
    嵌入式<b class='flag-5'>Linux</b>入門(五、<b class='flag-5'>Shell</b><b class='flag-5'>腳本</b><b class='flag-5'>編程</b>上:認識<b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>)

    Linux shell腳本分享

    今天浩道跟大家分享幾個Linux運維中常用到的shell腳本
    發表于 07-18 09:53 ?578次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>shell</b><b class='flag-5'>腳本</b>分享

    linux shell 腳本入門

    1. Linux 腳本編寫基礎 1.1 語法基本介紹 1.1.1 開頭 程序必須以下面的行開始(必須方在文件的第一行): #!/bin/sh 符號#!用來告訴系統它后面的參數是用來執行該文件的程序
    發表于 11-07 15:44 ?11次下載

    Linux Shell腳本編程基礎和相關資料合集免費下載

    本文檔的主要內容詳細介紹的是Linux Shell腳本編程基礎和相關資料合集免費下載。
    發表于 05-24 17:53 ?26次下載
    <b class='flag-5'>Linux</b> <b class='flag-5'>Shell</b><b class='flag-5'>腳本</b><b class='flag-5'>編程</b>基礎和相關資料合集免費下載

    如何創建和執行一個簡單的Linux shell腳本

     如果您愿意要嘗試更長的shell腳本,請將下面的shell腳本(并附加為PDF和ODT文件)復制到文本編輯器,保存,使其可執行并運行。當
    的頭像 發表于 11-06 17:28 ?1.3w次閱讀

    Linuxshell腳本執的4種方式

    Linuxshell腳本的執行通常有4種方式,分別為工作目錄執行,絕對路徑執行,sh執行,shell環境執行。
    發表于 05-23 09:28 ?932次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b><b class='flag-5'>shell</b><b class='flag-5'>腳本</b>執的4種方式

    Linux系統命令及shell腳本實踐指南

    Linux系統命令及shell腳本實踐指南資料下載。
    發表于 06-01 14:47 ?28次下載

    Linux開發_Makefile規則與Shell腳本語言

    介紹Linux下Makefile編程知識點,Shell腳本知識點。
    的頭像 發表于 09-17 15:40 ?1328次閱讀

    Linux開發_Shell腳本編程語言

    介紹LinuxShell編程,介紹shell里語句、變量、函數、運算符的使用。
    的頭像 發表于 09-17 15:39 ?1238次閱讀

    Linux命令行與shell腳本編寫

    Linux命令行與shell腳本編寫
    發表于 01-11 16:50 ?4次下載

    Linux Shell腳本經典案例分享

    ? 作為一名 Linux 運維工程師,會寫好的腳本不僅能提高工作效率,還能有更多的時間做自己的事。最近在網上沖浪的時候,發現大家對Shell腳本都有“心結”,要么覺得自己寫出來不好
    發表于 06-16 14:03 ?677次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>經典案例分享

    linux命令和shell編程有什么聯系

    的命令,并提供了許多功能和特性,如變量、控制結構、函數等,這些功能和特性使得Shell編程成為可能。 其次,Linux命令是Shell編程
    的頭像 發表于 11-08 10:53 ?963次閱讀

    linux命令行與shell編程實戰

    Linux命令行與Shell編程實戰主要涉及以下內容: Linux命令行基礎:學習Linux命令行的基本操作,如文件管理、進程管理、網絡配置
    的頭像 發表于 11-08 10:57 ?830次閱讀

    Linux從零到精通:最簡單的Shell腳本入門教程

    在數字化時代的浪潮Linux操作系統憑借其高效、穩定、開源的特性,成為了無數開發者和系統管理員的首選。 而在Linux的龐大生態系統Shel
    的頭像 發表于 12-05 09:56 ?650次閱讀
    <b class='flag-5'>Linux</b>從零到精通:最簡單的<b class='flag-5'>Shell</b><b class='flag-5'>腳本</b>入門教程
    如何玩百家乐官网的玩法技巧和规则 | 如何玩百家乐官网扑克| 麻将二八杠技巧| 百家乐算牌e世博| 百家乐官网真人赌场娱乐网规则| 百家乐官网园游戏庄闲| 百家博国际娱乐城| 大发888坑人么| 大发888信誉| 黄金城百家乐下载| 华泰百家乐的玩法技巧和规则 | 百家乐用品| 百家乐制胜法| 百家乐技巧-百家乐开户指定代理网址| 做生意开店铺风水大全| 立博百家乐游戏| 百家乐视频打麻将| 百家乐打法分析| 百家乐官网德州扑克发牌盒| 百家乐官网牌盒| 百家乐分析软体| 网络百家乐可信吗| 百家乐网投打法| 百家乐走势图解| 百家乐官网视频游戏道具| 体育| 乐九百家乐官网娱乐城| 百家乐官网游戏机论坛| 百家乐官网怎样玩的| 贝博百家乐官网的玩法技巧和规则| 百家乐官网软件代理| 新百家乐官网的玩法技巧和规则 | 百家乐官网游戏教程| 怎样赢百家乐官网的玩法技巧和规则 | 汝南县| 代理百家乐官网最多占成| 百家乐官网美食坊| 百家乐官网小路单图解| A8百家乐现金网| 自贡百家乐娱乐场开户注册| 大发888 安装包的微博|