初識shell程式設計

2022-11-24 17:16:25 字數 4606 閱讀 6495

shell是使用者與核心進行互動操作的一種介面,目前最流行的shell稱為bash shell

shell也是一門程式語言<解釋型的程式語言》,即shell指令碼《就是在用linux的shell命令程式設計》

一個系統可以存在多個shell,可以通過cat /etc/shells命令檢視系統中安裝的shell,不同的shell可能支援的命令語法是不相同的

**寫在普通文字檔案中,通常以 .sh為字尾名

vi hello.sh

#!/bin/bash    ## 表示用哪一種shell解析器來解析執行我們的這個指令碼程式

echo

"hello world

"## 註釋也可以寫在這裡

## 這是一行註釋

執行指令碼

sh hello.sh

或給指令碼新增x許可權,直接執行

chmod 755 hello.sh

./hello.sh

linux shell中的變數分為“系統變數”和“使用者自定義變數”

可以通過set命令檢視系統變數

系統變數:$home、$pwd、$shell、$user等等

1、語法

變數=值 (例如str=abc)

等號兩側不能有空格

變數名稱一般習慣為大寫

使用變數: $arg

雙引號和單引號有區別,①雙引號僅將空格脫意,② 單引號會將變數引用比如$param脫意

2、示例

vi hello.sh進入編輯模式,

str="hello world"

a=9echo $a

echo $str

如果想列印 hello worlds is greater  怎麼辦?

echo $strs is greate

行嗎?不行,正確寫法是:

echo $s is greate

unset a 撤銷變數 a

readonly b=2 宣告靜態的變數 b=2,不能 unset

執行結果:

export  a   #可把變數提升為當前shell程序中的全域性環境變數,可供其他子shell程式使用

注意理解export,看下面示例:

vi a.sh

#!/bin/bash

a="a in a.sh

"echo $a

/root/b.sh

vi b.sh

#!/bin/bash

b="b in b.sh

"echo $b

echo $a

分別賦操作 許可權:chmod 755 a.sh   chmod 755 b.sh

然後執行  ./a.sh ,會發現 b指令碼中並沒有把a指令碼中定義的a變數列印出來

如果要在b中列印出a指令碼的變數a,需要在a指令碼中把變數a做export定義

此時,a變數就成了a.sh指令碼所在bash程序的全域性變數,該程序的所有子程序都能訪問到變數a

具體操作,修改a.sh, vi a.sh

#!/bin/bash

export a="

a in a.sh

"echo $a

/root/b.sh

執行./a.sh

這次a的子程序b就能訪問a程序的變數 了!

另一種方式:

如果在a.sh指令碼中用如下方式呼叫b.sh

.  ./b.sh    ## 注意:重點關注最前面那個 “.”號
或者

source ./b.sh
則,b.sh就在a.sh所在的bash程序空間中執行

總結:

1、a.sh中直接呼叫b.sh,會讓b.sh在a所在的bash程序的“子程序”空間中執行

2、而子程序空間只能訪問父程序中用export定義的變數

3、一個shell程序無法將自己定義的變數提升到父程序空間中去

4、“.”號執行指令碼時,會讓指令碼在呼叫者所在的shell程序空間中執行

3、反引號賦值

a=`ls -la`    ## 反引號,執行裡面的命令,並把結果返回給變數a

a=$(ls -la)   ## 等價於反引號

4、特殊變數

$? 表示上一個命令退出的狀態碼

$$ 表示當前程序編號

$0 表示當前指令碼名稱

$n 表示n位置的輸入引數(n代表數字,n>=1)

$#   表示引數的個數,常用於迴圈

$*和[email protected] 都表示引數列表  .`

注:$*[email protected]區別

$* 和 [email protected] 都表示傳遞給函式或指令碼的所有引數

ü  不被雙引號" "包含時——

$* 和 [email protected] 都以$1  $2  … $n 的形式組成引數列表

ü  當它們被雙引號" "包含時——

"$*" 會將所有的引數作為一個整體,以"$1 $2 … $n"的形式組成一個整串;

"[email protected]" 會將各個引數分開,以"$1" "$2" … "$n" 的形式組成一個引數列表

1、用expr

格式 expr m + n 或$((m+n)) 注意expr運算子間要有空格

例如計算(2+3 )×4 的值

1 .分步計算

s=`expr 2 + 3`

expr $s \* 4       ##  

*號需要轉義

2.一步完成計算

expr

`expr 2 + 3 ` \* 4

echo

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

2、用(())

((1+2))

(((2+3)*4))

count=1

((count++))

echo $count

但是要想取到運算結果,需要用$引用

a=$((1+2))

3、用$

a=$[1+2]

echo $a

1、語法格式

if condition 

then 

statements 

[elif condition 

then statements. ..] 

[else 

statements ] 

fi2、示例

#!/bin/bash
read -p "please input your name:"name   ## read命令用於從控制檯讀取輸入資料

## printf '%s\n'$name

if [ $name =root ]

then

echo "hello $, welcome !"elif [ $name =likemebee ]

then

echo "hello $, welcome !"

elseecho "sb, get out here !"fi

3、判斷條件

1/ 條件判斷基本語法

[ condition ] (

注意condition

前後要有空格)

#非空返回true,可使用$?驗證(0為true,>1為false)

[ likemebee]

#空返回false

注意[  ]內部的=周邊的空格,有區別:

【未完待續……持續更新】

(Shell)Shell命令整理

目錄上傳檔案 rz,然後回車彈出上傳檔案介面 刪除檔案 rm f 檔名 刪除資料夾 同時刪除資料夾裡的內容 rm rf 資料夾名 新建目錄 mkdir 資料夾名稱 重新命名目錄 mv f1 f2 檢視當前目錄 pwd 建立目錄樹 mkdir p home mingqiang.wu temp dir1...

shell

shell 運算子 a 12 b 13 c a b 加號之間得有空格,號兩邊不能有空格,號取的是整數,號要用 轉義 在 中無須對 進行轉義 條件測試 d dir echo 裡面兩邊必須得有空格 if read p input num if num gt 0 then echo ok fi 結束 ca...

shell

1 重定向 filename 清空filename echo djadl filename 寫入 echo dajf filename 追加 cat filename 提取檔案內容 2 管道 前一個命令的輸出,作為後一個命令的輸入引數 兩個命令同時執行 前面命令不能執行時,執行後面的命令 tr替換 ...