shell一文入門通
簡單來說“Shell程式設計就是對一堆Linux命令的邏輯化處理”。
W3Cschool 上的一篇文章是這樣介紹 Shell的
hello world
學習任何一門程式語言第一件事就是輸出HelloWord了!下面我會從新建檔案到shell程式碼編寫來說下Shell 程式設計如何輸出Hello World。
(1)新建一個檔案 helloworld.sh :touch helloworld.sh
,副檔名為 sh(sh代表Shell)(副檔名並不影響指令碼執行,見名知意就好,如果你用 php 寫 shell 指令碼,副檔名就用 php 好了)
(2) 使指令碼具有執行許可權:chmod +x helloworld.sh
(3) 使用 vim 命令修改helloworld.sh檔案:vim helloworld.sh
(vim 檔案------>進入檔案----->命令模式------>按i進入編輯模式----->編輯檔案 ------->按Esc進入底行模式----->輸入:wq/q! (輸入wq代表寫入內容並退出,即儲存;輸入q!代表強制退出不儲存。))
helloworld.sh 內容如下:
#!/bin/bash
#第一個shell小程式,echo 是linux中的輸出命令。
echo "helloworld!"
shell中 # 符號表示註釋。shell 的第一行比較特殊,一般都會以#!開始來指定使用的 shell 型別。在linux中,除了bash shell以外,還有很多版本的shell, 例如zsh、dash等等...不過bash shell還是我們使用最多的。
(4) 執行指令碼:./helloworld.sh
。(注意,一定要寫成 ./helloworld.sh
,而不是 helloworld.sh
,執行其它二進位制的程式也一樣,直接寫 helloworld.sh
,linux 系統會去 PATH 裡尋找有沒有叫 helloworld.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 裡,你的當前目錄通常不在 PATH 裡,所以寫成 helloworld.sh
是會找不到命令的,要用./helloworld.sh
告訴系統說,就在當前目錄找。)
變數
Shell程式設計中一般分為三種變數:
- 我們自己定義的變數(自定義變數): 僅在當前 Shell 例項中有效,其他 Shell 啟動的程式不能訪問區域性變數。
- Linux已定義的環境變數(環境變數, 例如:$PATH, $HOME 等..., 這類變數我們可以直接使用),使用
env
命令可以檢視所有的環境變數,而set命令既可以檢視環境變數也可以檢視自定義變數。 - Shell變數 :Shell變數是由 Shell 程式設定的特殊變數。Shell 變數中有一部分是環境變數,有一部分是區域性變數,這些變數保證了 Shell 的正常執行
常用的環境變數:
PATH 決定了shell將到哪些目錄中尋找命令或程式 HOME 當前使用者主目錄 HISTSIZE 歷史記錄數 LOGNAME 當前使用者的登入名 HOSTNAME 指主機的名稱 SHELL 當前使用者Shell型別 LANGUGE 語言相關的環境變數,多語言可以修改此環境變數 MAIL 當前使用者的郵件存放目錄 PS1 基本提示符,對於root使用者是#,對於普通使用者是$
使用 Linux 已定義的環境變數:
比如我們要看當前使用者目錄可以使用:echo $HOME
命令;如果我們要看當前使用者Shell型別 可以使用echo $SHELL
命令。可以看出,使用方法非常簡單。
使用自己定義的變數:
#!/bin/bash
#自定義變數hello
hello="hello world"
echo $hello
echo "helloworld!"
Shell 程式設計中的變數名的命名的注意事項:
- 命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭,但是可以使用下劃線(_)開頭。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。
字串
字串是shell程式設計中最常用最有用的資料型別(除了數字和字串,也沒啥其它型別好用了),字串可以用單引號,也可以用雙引號。這點和Java中有所不同。
單引號字串:
#!/bin/bash
name='SnailClimb'
hello='Hello, I am '$name'!'
echo $hello
輸出內容:
Hello, I am SnailClimb!
雙引號字串:
#!/bin/bash
name='SnailClimb'
hello="Hello, I am "$name"!"
echo $hello
輸出內容:
Hello, I am SnailClimb!
拼接字串:
#!/bin/bash
name="SnailClimb"
# 使用雙引號拼接
greeting="hello, "$name" !"
greeting_1="hello, ${name} !"
echo $greeting $greeting_1
# 使用單引號拼接
greeting_2='hello, '$name' !'
greeting_3='hello, ${name} !'
echo $greeting_2 $greeting_3
輸出結果:
獲取字串長度:
#!/bin/bash
#獲取字串長度
name="SnailClimb"
# 第一種方式
echo ${#name} #輸出 10
# 第二種方式
expr length "$name";
輸出結果:
10
10
使用 expr 命令時,表示式中的運算子左右必須包含空格,如果不包含空格,將會輸出表示式本身:
expr 5+6 // 直接輸出 5+6
expr 5 + 6 // 輸出 11
對於某些運算子,還需要我們使用符號\
進行轉義,否則就會提示語法錯誤。
expr 5 * 6 // 輸出錯誤
expr 5 \* 6 // 輸出30
擷取子字串:
簡單的字串擷取:
#從字串第 1 個字元開始往後擷取 10 個字元
str="SnailClimb is a great man"
echo ${str:0:10} #輸出:SnailClimb
根據表示式擷取:
#!bin/bash
#author:amau
var="http://www.runoob.com/linux/linux-shell-variable.html"
s1=${var%%t*}#h
s2=${var%t*}#http://www.runoob.com/linux/linux-shell-variable.h
s3=${var%%.*}#http://www
s4=${var#*/}#/www.runoob.com/linux/linux-shell-variable.html
s5=${var##*/}#linux-shell-variable.html
陣列
bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。我下面給了大家一個關於陣列操作的 Shell 程式碼示例,通過該示例大家可以知道如何建立陣列、獲取陣列長度、獲取/刪除特定位置的陣列元素、刪除整個陣列以及遍歷陣列。
#!/bin/bash
array=(1 2 3 4 5);
# 獲取陣列長度
length=${#array[@]}
# 或者
length2=${#array[*]}
#輸出陣列長度
echo $length #輸出:5
echo $length2 #輸出:5
# 輸出陣列第三個元素
echo ${array[2]} #輸出:3
unset array[1]# 刪除下標為1的元素也就是刪除第二個元素
for i in ${array[@]};do echo $i ;done # 遍歷陣列,輸出: 1 3 4 5
unset arr_number; # 刪除陣列中的所有元素
for i in ${array[@]};do echo $i ;done # 遍歷陣列,陣列元素為空,沒有任何輸出內容
Shell 程式設計支援下面幾種運算子
- 算數運算子
- 關係運算子
- 布林運算子
- 字串運算子
- 檔案測試運算子
算數
我以加法運算子做一個簡單的示例(注意:不是單引號,是反引號):
#!/bin/bash
a=3;b=3;
val=`expr $a + $b`
#輸出:Total value : 6
echo "Total value : $val"
關係
關係運算子只支援數字,不支援字串,除非字串的值是數字。
通過一個簡單的示例演示關係運算子的使用,下面shell程式的作用是當score=100的時候輸出A否則輸出B。
#!/bin/bash
score=90;
maxscore=100;
if [ $score -eq $maxscore ]
then
echo "A"
else
echo "B"
fi
輸出結果:
B
邏輯
示例:
#!/bin/bash
a=$(( 1 && 0))
# 輸出:0;邏輯與運算只有相與的兩邊都是1,與的結果才是1;否則與的結果是0
echo $a;
布林
這裡就不做演示了,應該挺簡單的。
字串
簡單示例:
#!/bin/bash
a="abc";
b="efg";
if [ $a = $b ]
then
echo "a 等於 b"
else
echo "a 不等於 b"
fi
輸出:
a 不等於 b
檔案
使用方式很簡單,比如我們定義好了一個檔案路徑file="/usr/learnshell/test.sh"
如果我們想判斷這個檔案是否可讀,可以這樣if [ -r $file ]
如果想判斷這個檔案是否可寫,可以這樣-w $file
,是不是很簡單。
流程控制
if
簡單的 if else-if else 的條件語句示例
#!/bin/bash
a=3;
b=9;
if [ $a -eq $b ]
then
echo "a 等於 b"
elif [ $a -gt $b ]
then
echo "a 大於 b"
else
echo "a 小於 b"
fi
輸出結果:
a 小於 b
相信大家通過上面的示例就已經掌握了 shell 程式設計中的 if 條件語句。不過,還要提到的一點是,不同於我們常見的 Java 以及 PHP 中的 if 條件語句,shell if 條件語句中不能包含空語句也就是什麼都不做的語句。
for
通過下面三個簡單的示例認識 for 迴圈語句最基本的使用,實際上 for 迴圈語句的功能比下面你看到的示例展現的要大得多。
輸出當前列表中的資料:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
產生 10 個隨機數:
#!/bin/bash
for i in {0..9};
do
echo $RANDOM;
done
輸出1到5:
通常情況下 shell 變數呼叫需要加 $,但是 for 的 (()) 中不需要,下面來看一個例子:
#!/bin/bash
for((i=1;i<=5;i++));do
echo $i;
done;
while
基本的 while 迴圈語句:
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
while迴圈可用於讀取鍵盤資訊:
echo '按下 <CTRL-D> 退出'
echo -n '輸入你最喜歡的電影: '
while read FILM
do
echo "是的!$FILM 是一個好電影"
done
輸出內容:
按下 <CTRL-D> 退出
輸入你最喜歡的電影: 變形金剛
是的!變形金剛 是一個好電影
無限迴圈:
while true
do
command
done
不帶引數沒有返回值的函式
#!/bin/bash
hello(){
echo "這是我的第一個 shell 函式!"
}
echo "-----函式開始執行-----"
hello
echo "-----函式執行完畢-----"
-----函式開始執行-----
這是我的第一個 shell 函式!
-----函式執行完畢-----
有返回值
相加
#!/bin/bash
funWithReturn(){
echo "輸入第一個數字: "
read aNum
echo "輸入第二個數字: "
read anotherNum
echo "兩個數字分別為 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個數字之和為 $?"
輸入第一個數字:
1
輸入第二個數字:
2
兩個數字分別為 1 和 2 !
輸入的兩個數字之和為 3
帶引數
#!/bin/bash
funWithParam(){
echo "第一個引數為 $1 !"
echo "第二個引數為 $2 !"
echo "第十個引數為 $10 !"
echo "第十個引數為 ${10} !"
echo "第十一個引數為 ${11} !"
echo "引數總數有 $# 個!"
echo "作為一個字串輸出所有引數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
第一個引數為 1 !
第二個引數為 2 !
第十個引數為 10 !
第十個引數為 34 !
第十一個引數為 73 !
引數總數有 11 個!
作為一個字串輸出所有引數 1 2 3 4 5 6 7 8 9 34 73 !
相關文章
- shell入門
- shell入門系列
- shell入門基礎
- Spring Shell入門介紹Spring
- Shell 程式設計入門程式設計
- Shell從入門到精通
- 一文入門RedisRedis
- Shell 入門系列 (一): 變數變數
- 一文快速入門DockerDocker
- Linux入門---(三)Shell程式設計Linux程式設計
- 一文帶你入門LinuxLinux
- 一文帶你入門TransformerORM
- 一文入門 Spring Cloud TencentSpringCloud
- 一文帶你入門 GolangGolang
- ChatGPT 通識入門ChatGPT
- Shell 入門系列: 導航 (未完待續)
- Linux基礎入門(一)初識ShellLinux
- 簡單的 Shell 指令碼入門教程指令碼
- 一文快速入門體驗 Hibernate
- shell入門基礎&常見命令及用法
- Linux-shell程式設計入門基礎Linux程式設計
- linux Shell 命令列-01-intro 入門介紹Linux命令列
- shell——shell輸入輸出
- 科研怎麼入門?一文就夠了。
- 一文帶你入門動態規劃動態規劃
- Linux Shell 從入門到刪除根目錄跑路指南Linux
- 從入門到掌握 - 系統學習shell語言
- Shell指令碼入門:編寫格式與執行方式指令碼
- 【Linux入門】Shell基本運算子的分類有哪些?Linux
- Linux shell有哪些型別?Linux入門知識分享Linux型別
- Nucleo入門--004通用輸入輸出
- Android入門教程 | Fragment (載入方法與通訊)AndroidFragment
- RabbitMQ 入門(一)同步通訊和非同步通訊MQ非同步
- 簡單明瞭,一文入門視覺SLAM視覺SLAM
- 一文入門DNS?從訪問GitHub開始DNSGithub
- 一文快速入門分庫分表(必修課)
- 一文帶你入門圖機器學習機器學習
- 一文快速入門任務排程框架-Quartz框架quartz