shell一文入門通

簡單來說“Shell編程就是對一堆Linux命令的邏輯化處理”。

W3Cschool 上的一篇文章是這樣介紹 Shell的什么是 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 編程Hello World

變量

Shell編程中一般分為三種變量:

  1. 我們自己定義的變量(自定義變量):?僅在當前 Shell 實例中有效,其他 Shell 啟動的程序不能訪問局部變量。
  2. Linux已定義的環境變量(環境變量, 例如:$PATH, $HOME 等..., 這類變量我們可以直接使用),使用?env?命令可以查看所有的環境變量,而set命令既可以查看環境變量也可以查看自定義變量。
  3. 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:amauvar="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關系運算符

通過一個簡單的示例演示關系運算符的使用,下面shell程序的作用是當score=100的時候輸出A否則輸出B。

#!/bin/bash
score=90;
maxscore=100;
if [ $score -eq $maxscore ]
thenecho "A"
elseecho "B"
fi

輸出結果:

B

邏輯

邏輯運算符

示例:

#!/bin/bash
a=$(( 1 && 0))
# 輸出:0;邏輯與運算只有相與的兩邊都是1,與的結果才是1;否則與的結果是0
echo $a;

布爾

布爾運算符

這里就不做演示了,應該挺簡單的。

字符串

字符串運算符

簡單示例:


#!/bin/bash
a="abc";
b="efg";
if [ $a = $b ]
thenecho "a 等于 b"
elseecho "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 ]
thenecho "a 等于 b"
elif [ $a -gt $b ]
thenecho "a 大于 b"
elseecho "a 小于 b"
fi

輸出結果:

a 小于 b

相信大家通過上面的示例就已經掌握了 shell 編程中的 if 條件語句。不過,還要提到的一點是,不同于我們常見的 Java 以及 PHP 中的 if 條件語句,shell if 條件語句中不能包含空語句也就是什么都不做的語句。

for

通過下面三個簡單的示例認識 for 循環語句最基本的使用,實際上 for 循環語句的功能比下面你看到的示例展現的要大得多。

輸出當前列表中的數據:

for loop in 1 2 3 4 5
doecho "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++));doecho $i;
done;

while

基本的 while 循環語句:

#!/bin/bash
int=1
while(( $int<=5 ))
doecho $intlet "int++"
done

while循環可用于讀取鍵盤信息:

echo '按下 <CTRL-D> 退出'
echo -n '輸入你最喜歡的電影: '
while read FILM
doecho "是的!$FILM 是一個好電影"
done

輸出內容:

按下 <CTRL-D> 退出
輸入你最喜歡的電影: 變形金剛
是的!變形金剛 是一個好電影

無限循環:

while true
docommand
done

不帶參數沒有返回值的函數

#!/bin/bash
hello(){echo "這是我的第一個 shell 函數!"
}
echo "-----函數開始執行-----"
hello
echo "-----函數執行完畢-----"
-----函數開始執行-----
這是我的第一個 shell 函數!
-----函數執行完畢-----

有返回值

相加

#!/bin/bash
funWithReturn(){echo "輸入第一個數字: "read aNumecho "輸入第二個數字: "read anotherNumecho "兩個數字分別為 $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 !

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445050.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445050.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445050.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法(9)--兩個數的最大公約數

兩個數的最大公約數1.輾轉相除法求解兩個數的最大公約數2.更相減損術求解兩個數的最大公約數3.不嚴格理解1.輾轉相除法求解兩個數的最大公約數 輾轉相除法&#xff1a;兩個正整數a和b&#xff08;a>b&#xff09;的最大公約數等于a除以b的余數與b 之間的最大公約數。–如果…

RPC編程

圖 3 說明在客戶機和服務器之間完成 RPC 涉及的步驟。 圖 3. 在客戶機和服務器之間完成 RPC 涉及的步驟服務器 RPC 應用程序初始化期間它會向 RPC 運行時庫注冊接口。需要注冊接口是因為&#xff0c;客戶機在向服務器發出遠程過程調用時&#xff0c;要檢查它是否與服務器兼容。…

synchronized使用和原理全解

synchronized是Java中的關鍵字&#xff0c;是一種同步鎖。它修飾的對象有以下幾種&#xff1a; 修飾一個方法 被修飾的方法稱為同步方法&#xff0c;其作用的范圍是整個方法&#xff0c;作用的對象是調用這個方法的對象&#xff1b; 修飾一個靜態的方法 其作用的范圍是整個…

RPC學習筆記

在查看libc6-dev軟件包提供的工具&#xff08;用 dpkg -L libc6-dev 命令&#xff09;的時候&#xff0c;發現此軟件包提供了一個有用的工具rpcgen命令。通過rpcgen的man手冊看到此工具的作用是把RPC源程序編譯成C語言源程序&#xff0c;從而輕松實現遠程過程調用。下面的例子程…

算法(10)-leetcode-explore-learn-數據結構-鏈表雙指針技巧

leetcode-explore-learn-數據結構-鏈表21.概述2.例題2.1 環形鏈表判斷2.2 環形鏈表22.3 相交鏈表2.4 刪除鏈表的倒數第N個節點3.小結本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn…

一個簡單的游戲服務器框架

最近看到百度空間的一個帖子&#xff0c;不錯&#xff0c;在這里整理下&#xff0c;轉載至我的博客里&#xff0c;開始自己慢慢琢磨寫一個框架。 我先從上層結構說起&#xff0c;一直到實現細節吧&#xff0c;想起什么就寫什么。 第一部分 服務器邏輯 服務器這邊簡單的分為三…

堆和棧的精華大總結

Java內存分配原理 棧、堆、常量池雖同屬Java內存分配時操作的區域&#xff0c;但其適用范圍和功用卻大不相同。 一般Java在內存分配時會涉及到以下區域&#xff1a; ◆寄存器&#xff1a;我們在程序中無法控制 ◆棧&#xff1a;存放基本類型的數據和對象的引用&#xff0c;但…

算法(11)-leetcode-explore-learn-數據結構-鏈表的經典問題

leetcode-explore-learn-數據結構-鏈表31.反轉一個鏈表2.移除鏈表元素3.奇偶鏈表4.回文鏈表5.小結本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-l…

探索式軟件測試

James A.Whittaker [美] 詹姆斯惠特克&#xff08;軟件測試領域絕對的大師&#xff09;著作《Exploratory Software Testing》&#xff0c;中文名《探索式軟件測試》&#xff0c;記得當時被這本書深深吸引啦&#xff08;我不知道有多少做測試的小伙伴看過這本書&#xff09;&am…

Linux線程池的設計

我設計這個線程池的初衷是為了與socket對接的。線程池的實現千變萬化&#xff0c;我得這個并不一定是最好的&#xff0c;但卻是否和我心目中需求模型的。現把部分設計思路和代碼貼出&#xff0c;以期拋磚引玉。個人比較喜歡搞開源&#xff0c;所以大家如果覺得有什么需要改善的…

算法(12)-leetcode-explore-learn-數據結構-雙鏈表的設計

leetcode-explore-learn-數據結構-鏈表4雙鏈表的設計本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode官網&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-list/所有例題的編程語言為python 雙鏈表的設…

安全方面知識

什么是文件上傳漏洞 文件上傳漏洞是指 由于程序員在對用戶文件上傳部分的控制不足或者處理缺陷&#xff0c;而導致的用戶可以越過其本身權限向服務器上上傳可執行的動態腳本文件 這里上傳的文件可以是木馬&#xff0c;病毒&#xff0c;惡意腳本或者WebShell等。 這種攻擊方式是…

CE游戲外掛工具

CHEAT ENGINE(以下簡稱CE)是我見過的最優秀的游戲作弊工具。它的優點多不勝數&#xff0c;雖然單獨從搜索游 戲里面的數值來說&#xff0c;它并不比其他同類軟件強多少&#xff0c;但它不僅僅是個游戲修改工具&#xff0c;它還有其他游戲修改軟件所沒有的一些特點&#xff0c;例…

外掛編程-動作模擬技術

幾乎所有的游戲都有大量繁瑣和無聊的攻擊動作以增加玩家的 功力,還有那些數不完的迷宮,這些好像已經成為了角色游戲的代名詞。現在,外掛可以幫助玩家從這些繁瑣而無聊 的工作中擺脫出來。 1. 鼠標模擬技術 幾乎所有的游戲中都使用了鼠標來改變角色的位置和方向,玩家僅用…

算法(13)-leetcode-explore-learn-數據結構-鏈表小結

leetcode-explore-learn-數據結構-鏈表51.小結2.例題2.1合并兩個有序鏈表思路1:迭代思路2:遞歸2.2 兩數相加2.3 扁平化多級雙向鏈表2.4 復制帶隨機指針的鏈表2.5 旋轉鏈表本系列博文為leetcode-explore-learn子欄目學習筆記&#xff0c;如有不詳之處&#xff0c;請參考leetcode…

leetcode121買賣股票的最佳時機

給定一個數組&#xff0c;它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多只允許完成一筆交易&#xff08;即買入和賣出一支股票&#xff09;&#xff0c;設計一個算法來計算你所能獲取的最大利潤。 注意你不能在買入股票前賣出股票。 示例 1: 輸入: [7,1,5,3,6,…

epoll的內核實現

epoll是由一組系統調用組成。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); select/poll的缺點在于&#xff1…

算法(14)-數據結構-二叉樹

leetcode-explore-learn-數據結構-二叉樹10.概述1.深度優先遍歷dfs1.1先序遍歷-中左右1.2中序遍歷-左中右1.3后序遍歷-左右中2.廣度優先遍歷bfs3.遍歷-常見問題3.1 二叉樹的最大深度自頂向下自底向上3.2對稱二叉樹3.3路徑總和4.重構-常見問題4.1根據中序和后序遍歷序列構造二叉…

多進程魚多線程的權衡選擇

最近有好多人在網上問道做游戲開發框架用多線程還是多進程呢,或者兩者之間的優缺點,等等類似的問題。下邊小高就帶您小小分析一下: 1、首先要明確進程和線程的含義:進程(Process)是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,是系統進行資源分配和調度的一…

leetcode322 零錢兌換

給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額&#xff0c;返回 -1。 示例 1: 輸入: coins [1, 2, 5], amount 11 輸出: 3 解釋: 11 5 5 1 示例 2: 輸入: coins [2],…