shell編程基礎語法

1、 概述

Shell是一個命令行解釋器,它爲用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序,用戶能夠用Shell來啓動、掛起、中止甚至是編寫一些程序。
Shell 是一個應用程序,它鏈接了用戶和 Linux 內核,讓用戶可以更加高效、安全、低成本地使用 Linux 內核,這就是 Shell 的本質。
基本結構Shell仍是一個功能至關強大的編程語言,易編寫、易調試、靈活性強。Shell是解釋執行的腳本語言,在Shell中能夠調用Linux系統命令。java

2、 shell腳本的執行方式

一、echo輸出命令

####(1)基本語法:shell

echo [選項] [輸出內容]
選項:
-e: 支持反斜線控制的字符轉換
控制字符 做 用
\\ 輸出自己
a 輸出警告音
b 退格鍵,也就是向左刪除鍵
c 取消輸出行末的換行符。和「-n」選項一致
e ESCAPE鍵
f 換頁符
n 換行符
r 回車鍵
t 製表符,也就是Tab鍵
v 垂直製表符
0nnn 按照八進制ASCII碼錶輸出字符。其中0爲數字零,nnn是三位八進制數
xhh 按照十六進制ASCII碼錶輸出字符。其中hh是兩位十六進制數

####(2)案例編程

[root@localhost ~]# echo "helloworld"

helloworld

二、第一個Shell腳本

(1)需求:建立一個Shell腳本,輸出helloworld

(2)實操:

[root@localhost ~]# touch helloworld.sh

[root@localhost ~]# vi helloworld.sh
在helloworld.sh中輸入以下內容
#!**/**bin**/**bash  

echo "helloworld"

3、腳本的經常使用執行方式

第一種:輸入腳本的絕對路徑或相對路徑安全

一、首先要賦予helloworld.sh 腳本的+x權限

[root@localhost ~]# chmod 777 helloworld.sh

二、執行腳本

/root/helloWorld.sh

 ./helloWorld.sh

第二種:bash或sh+腳本(不用賦予腳本+x權限)bash

sh /root/helloWorld.sh

 sh helloWorld.sh

三、shell中的變量

1)Linux Shell中的變量分爲「系統變量」和「用戶自定義變量」,能夠經過set命令查看系統變量。
2)系統變量:$HOME、$PWD、$SHELL、$USER等等
3)顯示當前shell中全部變量:set編程語言

3.1 、 定義變量

1)基本語法:函數

變量=值oop

2)變量定義規則spa

(1)變量名稱能夠由字母、數字和下劃線組成,可是不能以數字開頭。
(2)等號兩側不能有空格
(3)變量名稱通常習慣爲大寫
(4)雙引號和單引號有區別,雙引號僅將空格脫意,單引號會將全部特殊字符脫意命令行

3)案例

STR=「hello world」
A=8 定義變量A
unset A 撤銷變量A
readonly B=2 聲明靜態的變量B=2,不能unset
export變量名 可把變量提高爲全局環境變量,可供其餘shell程序使用

3.二、 將命令的返回值賦給變量

A= ls -la 反引號,運行裏面的命令,並把結果返回給變量A
A=$(ls -la) 等價於反引號

3.三、設置環境變量

1)基本語法:

export 變量名=變量值 (功能描述:設置環境變量的值)
echo $變量名 (功能描述:查詢環境變量的值)
source 配置文件 (功能描述:讓修改後的配置信息當即生效)

2)案例:

在/etc/profile文件中定義JAVA_HOME環境變量
export JAVA_HOME=/opt/java/jdk1.7.0_79
export PATH=$PATH:$JAVA_HOME/bin
查看環境變量JAVA_HOME的值
[root@localhost ~]# echo $JAVA_HOME
/opt/java/jdk1.7.0_79

四、 位置參數變量

1)基本語法

符號 功能描述
$n n爲數字,$0表明命令自己,$1 - $9表明第一到第九個參數,十以上的參數,十以上的參數須要用大括號包含,如${10}
$* 這個變量表明命令行中全部的參數,$*把全部的參數當作一個總體
$@ 這個變量也表明命令行中全部的參數,不過$@把每一個參數區分對待
$# 這個變量表明命令行中全部參數的個數

2)案例

(1)計算輸入的參數1和參數2的兩個數的和,並輸出到控制檯

#!/bin/bash

num1=$1

num2=$2

sum=$(( $num1 + $num2))

#變量sum的和是num1加num2

echo $sum

#打印變量sum的值

(2)打印輸入的參數總數、全部參數

#!/bin/bash
echo "A total of $# parameters"
#使用$#表明全部參數的個數
echo "The parameters is: $*"
#使用$*表明全部的參數
echo "The parameters is: $@"
#使用$@也表明全部參數

(3)$*與$@的區別

#!/bin/bash
for i in "$*"
#$*中的全部參數當作是一個總體,因此這個for循環只會循環一次
 do
 echo "The parameters is: $i"
 done
x=1
for y in "$@"
#$@中的每一個參數都當作是獨立的,因此「$@」中有幾個參數,就會循環幾回
 do
 echo "The parameter$x is: $y"
 x=$(( $x +1 ))
 done
a)$*和$@都表示傳遞給函數或腳本的全部參數,不被雙引號「」包含時,都以$1 $2 …$n的形式輸出全部參數

b)當它們被雙引號「」包含時,「$*」會將全部的參數做爲一個總體,以「$1 $2 …$n」的形式輸出全部參數;「$@」會將各個參數分開,以「$1」 「$2」…」$n」的形式輸出全部參數

五、 預約義變量

1)基本語法:

符號 功能描述
$ 最後一次執行的命令的返回狀態。若是這個變量的值爲0,證實上一個命令正確執行;若是這個變量的值爲非0(具體是哪一個數,由命令本身來決定),則證實上一個命令執行不正確了
$$ 當前進程的進程號(PID)
$! 後臺運行的最後一個進程的進程號(PID)

2)案例

#!/bin/bash
#輸出當前進程的PID,這個PID就是當前這個腳本執行時,生成的進程的PID
echo "The current process is $$"
#使用find命令在root目錄下查找hello.sh文件,符號&的意思是把命令放入後臺執行
find /root -name hello.sh &
echo "The last one Daemon process is $!"
echo "$?"

4、 運算符

一、基本語法:

(1)「$((運算式))」或「$[運算式]」

(2)expr m + n

注意expr運算符間要有空格

二、案例:計算(2+3)X4的值

(1)採用$[運算式]方式

[root@localhost ~]# S=$[(2+3)*4]

[root@localhost ~]# echo $S

(2)expr分佈計算

S=`expr 2 + 3`

 expr $S \* 4

(3)expr一步完成計算

expr `expr 2 + 3` \* 4

 echo `expr \`expr 2 + 3\`\*4`

5、 條件判斷

一、 判斷語句

1)基本語法:

[ condition ](注意condition先後要有空格)

注意:非空返回true,可以使用$?驗證(0爲true,>1爲false)

2)案例:

[test]  返回true

[]  返回false

[condition] && echo OK || echo notok  條件知足,執行後面的語句

二、 經常使用判斷條件

1)兩個整數之間比較

符號 含義
= 字符串比較
-lt 小於
-le 小於等於
-eq 等於
-gt 大於
-ge 大於等於
-ne 不等於

2)按照文件權限進行判斷

符號 含義
-r 有讀的權限
-w 有寫的權限
-x 有執行的權限

3)按照文件類型進行判斷

符號 含義
-f 有文件存在而且是一個常規的文件
-e 文件存在
-d 文件存在並是一個目錄

4)案例

[root@localhost ~]# [ 23 -ge 22 ]

[root@localhost ~]# [ -w student.txt ]

[root@localhost ~]# [ -e /root/install.log ]

6、 流程控制

一、 if判斷

1)基本語法:

if [ 條件判斷式 ];then
程序
fi
或者
if [ 條件判斷式 ]
then
程序
fi
注意事項:(1)[ 條件判斷式 ],中括號和條件判斷式之間必須有空格

2)案例

#!/bin/bash
read –p 「please input your name:」 NAME
#printf ‘%s\n’ $NAME
if[ $NAME = root ]
then
 echo 「hello ${NAME}, welcome !」
elif [ $NAME = hunhaoxuan]
 then
 echo 「hello ${NAME}, welcome !」
else
 echo 「sorry 」
fi

二、 case語句

1)基本語法:

case $變量名 in
"值1")
若是變量的值等於值1,則執行程序1
;;
"值2")
若是變量的值等於值2,則執行程序2
;;
…省略其餘分支…
*)
若是變量的值都不是以上的值,則執行此程序
;;
esac

2)案例

case $1 in
start)
 echo 「starting」
 ;;
stop)
 echo 「stoping」
 ;;
*)
 echo 「Usage:{start|stop}」
esac

三、 for循環

1)基本語法1:

for 變量 in 值1 值2 值3…
do
程序
done

2)案例:

(1)打印時間

#!/bin/bash
#打印時間
for time in morning noon afternoon evening
 do
 echo "This time is $time!"
 done

3)基本語法2:

for (( 初始值;循環控制條件;變量變化 ))
do
程序
done

4)案例

(1)從1加到100

#!/bin/bash
#從1加到100
s=0
for (( i=1;i<=100;i=i+1 ))
 do
 s=$(( $s+$i ))
 done
echo "The sum is : $s"

四、 while循環

1)基本語法:

while [ 條件判斷式 ]
do
程序
done

2)案例

(1)從1加到100

#!/bin/bash
#從1加到100
i=1
s=0
while [ $i -le 100 ]
#若是變量i的值小於等於100,則執行循環
 do
 s=$(( $s+$i ))
 i=$(( $i+1 ))
 done
echo "The sum is: $s"

7、 read讀取控制檯輸入

一、基本語法:

read(選項)(參數)
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒)。
參數      
變量:指定讀取值的變量名

二、案例

[root@localhost ~]# read -p "please input your name:" NAME
please input your name:hunhaoxuan
[root@localhost ~]# echo $NAME
hunhaoxuan

8、 函數

一、 系統函數

1)basename基本語法

basename [pathname] [suffix]             
basename [string] [suffix] (功能描述:basename命令會刪掉全部的前綴包括最後一個(‘/’)字符,而後將字符串顯示出來。

注意:
suffix爲後綴,若是suffix被指定了,basename會將pathname或string中的suffix去掉。

2)案例

[root@localhost ~]# basename /opt/test.txt

test.txt

[root@localhost ~]# basename /opt/test.txt .txt

test

3)dirname基本語法

dirname 文件絕對路徑 (功能描述:從給定的包含絕對路徑的文件名中去除文件名(非目錄的部分),而後返回剩下的路徑(目錄的部分))

4)案例

[root@localhost ~]# dirname /opt/test.txt

/opt

二、 自定義函數

1)基本語法:

[ function ] funname[()]
{
Action;
[return int;]
}
function start() / function start / start()
注意:
(1)必須在調用函數地方以前,先聲明函數,shell腳本是逐行運行。不會像其它語言同樣先編譯。
(2)函數返回值,只能經過$?系統變量得到,能夠顯示加:return返回,若是不加,將以最後一條命令運行結果,做爲返回值。return後跟數值n(0-255)

2)案例 (1)打印出比你輸入小的全部數(單參)

#!/bin/bash  
function LoopPrint()   
{   
 count=0;
 while [ $count -lt $1 ] ;
 do
 echo $count;
 expr ++count;
 sleep 1;
 done
 return 0;
} 
read -p "Please input the number: " n;   
LoopPrint $n; 

(2)多參

#!/bin/bash  
function LoopPrint()   
{   
 echo $2
 count=0;
 while [ $count -lt $1 ];
 do
 echo $count;
 expr ++count;
 sleep 1;
 done
 return 0;
} 
read -p "Please input the num1: " n;   
read -p "Please input the num2: " m; 
LoopPrint $n $m;

本文做者:魂皓軒 歡迎關注公衆號

本人保留全部權益,轉載請註明出處。 歡迎有故事、有想法的朋友和我分享,可發送至 e-mail: lwqforit@163.com

相關文章
相關標籤/搜索