Shell程序设计 | 基本语法 :变量、I/O、算术运算、条件判断、流程控制、函数
文章目錄
- 變量
- 環境變量
- 位置變量
- 特殊變量
- 自定義變量
- 數組
- I/O
- printf / echo
- read
- 算術運算
- let
- expr
- 條件判斷
- test
- 常用判斷條件
- 流程控制
- if
- case
- for
- while
- until
- 函數
- 系統函數
- 自定義函數
變量
環境變量
環境變量用于初始化shell的啟動環境,是系統定義的變量。
常用的環境變量有下面幾種
可以使用env命令來查看所有的環境變量,也可以直接echo查看某個環境變量的值
位置變量
我們可以使用shift命令來將參數左移,語法如下
shift 表示移動的位數每次左移一位
#!/bin/bashecho $@ shift 1 echo $@ shift 1 echo $@ shift 1 echo $@特殊變量
$n :表示輸入的第n個參數,當超過十的時候需要用大括號括起來,如${10}
$# :獲取輸入參數的個數
$? :獲取上一條命令的執行狀態,如果為0則說明執行成功,為1則說明執行失敗。當然也可以用于獲取函數返回值
$$ :獲取當前進程的pid
$@ :代表當前命令行中所有的參數,不過它會把每個參數區分對待
$* :代表當前命令行中所有的參數,不過它會把所有參數當成一個整體
自定義變量
定義變量的方式很簡單,只需要給它賦值進行,并且不需要指明類型
變量名=值當需要刪除變量的時候,可以使用unset命令
unset 變量名如果想要聲明常量,可以使用readonly關鍵字,但是需要注意,常量不可被unset
readonly 變量名我們還可以通過export命令將局部變量升級為環境變量
export 變量名注意事項
- 等號兩邊不能有空格
- 如果變量名中存在空格時需要以單引號或者雙引號括起來,否則會被當成命令
- bash中變量會被默認視為字符串類型,無法直接進行算數運算
數組
定義數組
數組名=( 元素1 元素2 元素3 ...... ) # 元素前后以空格為間隔顯示數組的所有元素
echo ${數組名[@]}顯示數組的元素個數
echo ${#數組名[@]}顯示數組的第i個元素
echo ${數組名[i]}例如
將參數作為數組元素,查看數組中的內容
I/O
printf / echo
shell中的輸出命令有printf和echo兩種,printf是從C語言中模仿而來,所以它可以指定類型、對其方式等屬性。
echo 輸出 printf 輸出同時echo輸出時會自帶換行,而printf則需要自己手動加入\n
read
read用于從終端獲取輸入
語法如下
實例:從終端獲取一個值并輸出
#!/bin/bashread -p "請輸入參數:" str echo $str算術運算
shell中存在兩種算術運算的命令,分別是let和expr
let
let的語法如下
let 變量名=值 let 變量名=變量名+值需要注意的是,當有變量加入運算的時候不需要在變量前面加$
通常為了簡便,我們也會使用兩個圓括號let
我們通常以以下兩種方式來獲取計算結果
$((運算式)) 或 $[運算式]expr
expr用來計算表達式,每一個運算符之間要有空格,并且當有變量加入時需要加上$
expr + , - , \*, /, %條件判斷
test
在shell中我們通常利用test來進行條件判斷,當結果為真時返回0,失敗時返回1
語法如下:
test 判斷內容不過我們通常都會以方括號的形式進行簡寫,如下
[ 判斷條件 ] # 需要注意的是條件前后需要有空格常用判斷條件
-n :非空(nonzero)
-z :為空(zero)
= :字符串相同 ??????????!= :字符串不同
-eq :等于(equal)?????????????? -ne :不等于(Not equal)
-lt :小于(less than) ?????????? -le :小于等于(less equal)
-gt :大于(greater than)??????-ge :大于等于(greater equal)
-r :有讀的權限(read)
-w :有寫的權限(write)
-x :有執行的權限(execute)
-f :文件存在并且是一個常規的文件(file)
-e :文件存在(existence)
-d :文件存在并是一個目錄(directory)
流程控制
if
if用于進行邏輯判斷,語法格式如下
if test 條件 # 或者使用[ 條件 ]then # 執行的命令 elif test 條件 # 進行其他的分支判斷then # 執行的命令 else # 剩余的情況# 執行的命令 fi例如判斷輸入的數字是否大于十
#!/bin/basha=$1if [ $a -lt 10 ]then echo "less than 10" elif [ $a -gt 10 ]then echo "greater than 10" elseecho "equal than 10" ficase
case用于進行分支選擇,語法格式如下
case $變量名 in"值A")# 執行分支A;;"值B")# 執行分支B;;"值C")# 執行執行分支C;;*)# 如果不為以上值,則執行缺省分支;; esac注意事項
- case行必須以in結尾,每個值必須要用雙引號包含,并以右括號結束
- ;;代表分支的結束,類似于C中的break
- *)代表缺省模式,類似于C中的default
例如以下使用情況
#!/bin/basha=$1 case $a in"1")echo "11111111111";;"2")echo "22222222222";;"3")echo "33333333333";;*)echo "default";; esacshell中的循環控制主要有for,while,until三種
for
shell中的for循環有兩種語法,一種是我們傳統的C語言for,另一種則類似C++中的范圍for
# 語法1 for ((初始值; 循環條件; 變量變化))do# 執行命令done# 語法2 for 變量 in 數組或者區間do# 執行命令done分別進行演示
計算1到100的累加和
#!/bin/bashi=0 sum=0 for ((i=0; i<=100; i++))dosum=$[$sum+$i]doneecho $sum
計算輸入的參數之和
while
while的邏輯是當判斷條件為真時執行循環
語法如下
#!/bin/bashwhile [ 判斷條件為真則執行 ]do# 執行命令doneuntil
until與while剛好相反,如果判斷條件為假,則until繼續執行
語法如下
#!/bin/bashuntil [ 判斷條件為假則執行 ]do# 執行命令done函數
系統函數
系統自建的函數庫在路徑 /etc/init.d/functions中
常用的主要有basename和dirname兩種,用于解析文件的路徑
basename通常用于獲取文件名,它會找到最后一個/的位置,并刪除前面所有字符
basename 文件路徑 [可選: 刪除的字符]例如
dirname主要用于獲取路徑名,它會去掉文件名,然后返回剩余的部分
dirname 文件路徑自定義函數
shell中也允許自定義函數,語法如下
function 函數名() #括號中不能填任何東西 {# 執行命令# 返回值 }注意事項
- 括號中不能填任何參數,傳參可以直接通過 $變量名的形式傳遞,返回值可以使用特殊變量 $? 獲取。如果沒有聲明返回值,則以函數最后一條命令的結果作為返回值
- shell腳本是逐行運行的,所以必須先聲明函數才能調用
獲取兩個數相加的結果
function add() {echo $[$1+$2] }read -p "請輸入參數A: " a read -p "請輸入參數B: " badd $a $b總結
以上是生活随笔為你收集整理的Shell程序设计 | 基本语法 :变量、I/O、算术运算、条件判断、流程控制、函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并发编程中常见的锁机制:乐观锁、悲观锁、
- 下一篇: Shell程序设计 | 文本处理工具 :