1. 程式人生 > 實用技巧 >shell基礎

shell基礎

一、shell是什麼

自然界

shell: (蛋、堅果、某些種子和某些動物的) 殼; 殼狀物; 炮彈;

計算機

在電腦科學中,Shell俗稱殼(用來區別於核),是指“為使用者提供操作介面”的軟體(命令解析器)。它類似於DOS下的command.com和後來的cmd.exe。它接收使用者命令,然後呼叫相應的應用程式。(摘自百度百科)

Shell 是一個應用程式,它連線了使用者和 Linux 核心,讓使用者能夠更加高效、安全、低成本地使用 Linux 核心,這就是 Shell 的本質。圖形化介面和命令列都是shell(w3c菜鳥教程)

二、bash shell和shell的區別

1、我們平時所說的shell為bash shell,為sh shell的升級版。

2、shell和bash shell 的關係, 舉個例子: shell為一系列瀏覽器,而bash shell為谷歌瀏覽器,bash shell為當前最流行的shell,如果沒有特指,我們平常所說的shell就預設指的是bash shell。

3、cat /etc/shells 檢視當前計算機已經安裝的shell,shell就像一個軟體,可以安裝新的,可以解除安裝舊的,也可以切換,echo $SHELL檢視當前選中的shell。

4,bash 沒有提供類似java,python的類庫和模組,它只能呼叫本系統的命令,所以嚴格來說:shell就是一堆命令的堆積,它不算是一門程式語言,因為每一個機子所安裝的shell有可能不同,比如centsos6 的有些命令在centos 7 上可能就有變化,所以它也不是跨平臺的語言。

三、特性

面向過程程式設計: c,python、bash 等等

面向物件:java、 c++、python 等等

bash完全為面向過程。

四、變數

1、bash shell(以下全部簡稱shell),定義變數預設全是str型別。

name=liuwf

name="liuwf"

age=18

注意,等號之間不要加空格,別問為什麼,就是這個規定的

2、export name=liuwf(定義全域性變數),還有其他很多方式定義全域性變數,有興趣可以去了解。

3、unset 刪除變數,ps. unset name(注意:bash沒有提供java python型別的垃圾銷燬機制,必須手動回收物件,否則時間長了會佔滿記憶體)

4、nums=(29 100 13 8 91 "ererer") 弱型別, 所以在一個數組中可存放任意型別

5、字串操作

1、拼接字串: str1=$name$url

2、echo ${name:1:2} 擷取字串

3、${#str} 獲取字串長度

6、位置引數

1、$0 代表命令本身, $1-$9代表順序引數編號,大於10的話使用括號,如${10}

2、 $* 把所有引數當作整體 $@ 把每個引數分開對待(它倆的功能一致,都是獲取全部變數)

3、$# 引數的個數

4、$?獲取上一個命令執行是否失敗,失敗返回非0

7、shebang機制

”Shebang”或者”Sha-bang”。長期以來,Shebang都沒有正式的中文名稱。Linux中國翻譯組的GOLinux將其翻譯為“釋伴”,即“解釋伴隨行”的簡稱,同時又是Shebang的音譯。(摘自w3c教程),如果非要問shebang漢字怎麼寫的話(這種人一律按照sb處理)。

ps.

#!/bin/bash

#!/bin/python

8、邏輯運算

&& 短路與

|| 短路或

!非

ps. ls /opt && echo "success" || echo "failure" 這行命令會列印success, 因為 ls /opt && echo "success"為真, 所以直接導致echo "failure" 不會執行。

9、運算

介紹最常見的一種:

(())

ps. i=1, j=2,echo k=$(($i+$j)) 列印結果為k=3

還有其他很多種運算的方式,有興趣可以自己去了解。

10、執行順序控制(此處只介紹if)

if condition

then

statement(s)

fi

ps.

read a
read b
 
if (($a==$b))
then
         echo "a和b相等"
fi                             

  

11、 迴圈

for((exp1; exp2; exp3))

do

statements

done

ps.

sum=0
 for ((i=1; i<=100; i++))
 do
         ((sum += i))
done                                                                                                                                                                                                                                                                      
echo "The sum is: $sum"

  

12、函式

function_name () {

list of commands

}

ps.

Hello () {                                                                                                                                                                                                                                                                
       echo "Hello World $1 $2"
       return 10
}
  
Hello liuwf Ail
echo $?

  

注意:1、shell的 函式引數是以位置變數的形式傳參的。

  2、shell並非python,沒有強制縮排。

13、最後舉個栗子

列印一下九九乘法表

 1 #########################################################################
  2 # File Name: test.sh
  3 # Author: liuwf
  4 # mail: [email protected]
  5 #Created Time:Mon 10 Aug 2020 06:48:38 PM CST
  6 #########################################################################
  7 #!/bin/bash
  
for i in `seq 1 9`
do
    for j in `seq $i`
        do
        echo -n "$i*$j=$[i*j]"                                                                                                                                                                                                                                              
    done
  echo
done
  

列印結果見下圖: