一、變量
1. shell腳本基礎知識
編譯型語言:如 c語言解釋型語言:shell 腳本
shell腳本的本質:shell命令的有序集合。
2.shell 編程的基本過程
基本過程分為三步:
- 建立shell文件:包含任意多行操作系統命令或shell命令的文本文件。——xx.sh
- 賦予shell文件執行權限,==用chmod命令修改權限==。
- 執行shell文件,直接在命令行上調用shell程序
示例:
- 建立shell文件 prog1.sh
data
- 賦予shell文件執行權限 (初始文本文件無執行權限)
chmod740prog1.sh
#或者
chmodu+xprog1.sh
- 執行shell文件
prog1.sh
#結果為
prog1.sh :notfound
原因是:shell在標準搜索路徑中找不到prog1.sh4.正確的執行shell文件
./prog1.sh
#結果為
2009年12月16日星期二14:52:57CST
3. shell變量
shell允許用戶建立變量存儲數據,但不支持數據類型(整型,字符,浮點型),將任何賦給變量的值都解釋為一串字符Variable = value
- count = 1
- echo $ count
-
DATE =
data
- echo $ DATE
==注意幾點:==
變量沒有類型
=號兩邊不能加空格
變量必須是大寫
賦值的時候要用``框起來
Bourne shell有如下四種變量:
-
用戶自定義變量:
- 在shell編程中通常使用全大寫變量:COUNT=1
- 變量的調用,在變量前加$:echo $HOME
- Linux shell / bash 從右向左賦值:Y=y、X=$Y、echo $X 、y
- 使用unset命令刪除變量的賦值:Z=hello、echo $Z、hello、unset Z、echo$Z
-
位置變量及命令行參數:
- $0 與鍵入的命令行一樣,包含腳本文件名
- $1,$2....$9 分別包含第一個到第九個命令行參數。
- $# 包含命令行參數的個數
- $@ 包含所有命令行參數:$1,$2,...$9
- $?包含前一個命令的退出狀態
- $* 包含所有命令行參數:$1,$2,....$9
- $$ 包含正在執行進程的ID號
- 預定義變量
必須在兩位數邊寫上 { } ,才能正常值一一樣。
- 環境變量
- HOME:/etc/passwd文件中列出的用戶目錄
- IFS: Internal Field Separator , 默認為空格,tab及換行符
- PATH:shell搜索路徑
- PS1,PS2:默認提示符($)及換行提示符(>)
- 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
在這里插入圖片描述
#!/bin/bash
echo"inputyearmonthday:"
readYMD
echo"Todayis$Y-$M-$D"
==expr命令:==算術運算命令expr主要用于進行簡單的整數運算,包括加(+)、減(-)、乘(*)和求模(%)等操作。例如
$expr12+5*3
27
$expr3-8/2
-1
$num=9
$sum=`expr$num*6`
$echo$sum
54
!!運算符間用空格分開!!
測試語句
==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$?//表示輸出前一個語句的結果
在這里插入圖片描述
#!/bin/bash
A="how"
B="how"
test$A=$B
echo$?//表示輸出前一個語句的結果
相等為0(真),不等為1(假)
#!/bin/bash
A="how"
B="hoW"
test$A=$B
echo$?//表示輸出前一個語句的結果
pwd
echo$?
lsfile
echo$?
最后ls file 沒有,所以結果為2
#!/bin/bash
A=99
B=88
test$A-ne$B
echo$?//表示輸出前一個語句的結果
test$A-gt$B
echo$?//表示輸出前一個語句的結果
在這里插入圖片描述
三、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
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
在這里插入圖片描述
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
判斷成績——多路分支語句 示例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
在這里插入圖片描述
四、shell 循環語句
1. 循環語句for的用法
當循環次數已經知道或確定時候,使用for循環語句來多次執行一條或者一組命令,循環體由語句括號do和done來限定。
格式為:
for變量名in單詞表
do
命令表
done
變量依次取單詞表中的各個單詞,每取一次單詞,就執行一次循環體中的命令。循環次數由單詞數確定。命令表中的命令可以是一條,也可以是由分號或換行符分開的多條。如果單詞表是命令行上的所有位置參數時,可以在for
實例代碼:
#!/bin/bash
#forIin`ls/etc`
do
echo"$I"
done
在這里插入圖片描述
==seq命令== :列出一系列的數字seq 起始數字 中間分量 終止分量
#!/bin/bash
forIin`seq1210`
do
echo"$I"
done
示例:拷貝當前目錄下的所有文件到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 的話 ,跳出整個循環。遇到偶數就跳出循環。
#!/bin/bash
if[$#-ne5]
then
echo"argument5"
exit
fi
forI
do
if[`expr$I%2`-eq1]
then
echo"$I"
else
continue
fi
done
若是continue的話 ,跳出當前循環。遇到偶數就跳出當前循環,繼續執行下面語句
五、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
若改為不返回值,用變量,函數的所有標準輸出都傳遞給了主程序的變量
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
在這里插入圖片描述
2. 函數變量作用域
- 全局作用域:在腳本的其他任何地方都能夠訪問該變量
- 局部作用域:只能在聲明變量的作用域內訪問
-
聲明局部變量的格式:
-
c Local variable_name = value
-
grep_user()
{
B=200
A=100
}
grep_user
echo"end:$A-$B"
結果發現函數內的變量,竟然是全局變量
如果我們要局部變量就 加一個local
grep_user()
{
B=200
localA=100
}
grep_user
echo"end:$A-$B"
在這里插入圖片描述
原文標題:Linux基礎-shell腳本編程
文章出處:【微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。
-
Linux
+關注
關注
87文章
11342瀏覽量
210273 -
編程
+關注
關注
88文章
3637瀏覽量
93934 -
Shell
+關注
關注
1文章
366瀏覽量
23439
原文標題:Linux基礎-shell腳本編程
文章出處:【微信號:yikoulinux,微信公眾號:一口Linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論