Linux中的Shell指令碼入門簡介

2021-10-07 09:32:16 字數 4960 閱讀 5859

算術運算

語句單引號、雙引號和倒引號

重定向管道

後台執行符號 &

命令操作

組操作 () {}

shell指令碼是把一系列命令敲進去,以.sh結尾的檔案,將許多指令彙整寫一起,讓使用者很容易地就能夠乙個操作執行多個命令。

儲存了該檔案之後

需要修改該檔案許可權

chmod a+x test.sh (當然u+x o+x g+x也可)

1、修改之後直接輸入./test.sh即可

其中.代表當前目錄

2、把當前目錄新增到$path中:path=\$path:.這樣就可以直接test.sh,不需要./即可執行

這個操作是一次性的,只在乙個終端下有效

echo $path 顯示的目錄是它會自動搜尋的目錄

3、一勞永逸的方法

把剛剛的語句寫入.bashrc(有些版本可能是.bash_profile或.profile)

開啟終端時會先自動執行.bashrc

ls -a 可以看到它(因為是隱藏檔案所以加-a)

可以在裡面給一些很長的目錄賦值 比如說mydir=/usr/local/…

這樣以後再進去就可以直接 cd $mydir 不用輸入這麼長一串了 適用於比較常用的路徑

4、還可以直接 bash test.sh 這時不需要它有可執行許可權

bash < test.sh 也可以 在這種情況下它後面是不能帶引數的 但是上面這種是可以的

很少使用bash <

開頭:#!/bin/bash

#開頭的都是注釋

環境變數

一般都是大寫的 可以用命令env來顯示linux中所有的環境變數

使用者變數

定義變數的方式:

1、var=***(給變數var賦值) echo $var

例如a=5 這個5是不能做數**算的(相當於字串?)

2、var=`commands` 或 var=$(commands)

把命令"commands"的結果賦值給變數 例如a= `date` a=$(date)

3、read var1 var2(從鍵盤中讀入資料)

例如:read a b

1 3$a/$b

如果read a b

13(無空格)

這是輸入的值小於變數個數的情況 則也不會報錯 大不了就是a是13 b是空

當輸入的值大於變數個數時 則…

例如read a b

1 2 3 4 5

則 $a是1 $b是2 3 4 5

即前面的對應不變 但是最後乙個對應除了前面所有的(注意是從鍵盤讀入的時候哦)

4、set a b c(表示位置變數)

這是abc不是變數 123才是變數,例如echo $1 結果是a

關於位置引數:

舉個例子

例如 pos.sh

這個檔案是這麼寫的:

#!/bin/bash

echo

$0$1

然後在命令列chmod u+x pos.sh

./pos.sh hello

結果:./pos.sh hello

也即$0就是前面的檔名 第乙個位置變數所對應的就是$1而不是$0

位置引數一般來說不超過9個即$1-$9

那麼超過九個怎麼辦?

用shift 這個要做的是類似於佇列的先進先出 把最前面的搞掉乙個

比如說set a b c

shift

預處理變數

$# 統計有多少個位置變數

$? 表示上一條命令執行之後的返回值 如果被正確執行返回0 沒有則返回非0(不同版本的值可能不同)

$$ 當前程序的程序號

用shell指令碼進行算術運算是很麻煩的

整數運算

1、$((expression)) 例:a=$((3+5))

2、let var=「expression」 例:let a = 「1+2」;echo $a

3、expr expression 例:echo $(expr 1+3) 這樣是不對的 輸出是1+3 echo $(expr 1 + 3)輸出才是4 在兩個數字和操作符之間是有空格的!

小數運算

a=$(echo 「1.01+3.0111」|bc) (bc代表任意精度 或者bc-l也可

echo $a

ifif 條件

then 命令1

else 命令2

fi例:檔案if.sh:

#!/bin/bash

iftest -f "$1"

then

echo

"$1 is an ordinary file."

else

echo

"$1 is not an ordinary file."

fi

在命令列中:

bash if.sh pos.sh (pos.sh要存在哦)

則 輸出 pos.sh is an ordinary file.

if test -f "$1"等價於 if [ -f 「$1」 ] 注意中括號裡兩端都有空格(兩個中括號也是可以的 當然和乙個中括號是一樣的就不用費事了)

如果存在elif:

ifthen

elif

then

else

ficase

語法:case var in

pattern1) commands;;

pattern2) commands;;

esac

例:

read answer

case

$answer

ina)

echo

"you choose a";;

b)echo

"you choose b";;

esac

while

while condition

do commands

done

n=0

while

[$n -lt 10 ]

doecho

$nlet n=

$n+1

done

until

和while語法相似,作用相反 即只有until後面的條件為假才do

until

dodone

for語法:

for var in list

do commands

done

for((e1;e2;e3))

do commands

done

示例:

for i in *.sh

dochmod +x $i

done

for((i=

1;i<=

10;i++

))do

echo

$idone

break 跳出所有迴圈

continue 跳出當前迴圈並繼續

nums=

"1 2 3 4 5 6 7"

for num in

$nums

單引號裡面的任何東西都當成字串進行處理

倒引號(`) 裡面的任何內容都當成命令執行

雙引號 把裡面的東西當成字串 但是遇到\或$時不是例如 「current directory is `pwd`」

當我們執行shell命令的時候有三個東西會被自動開啟:stdin,stdout和stderr

一般來說它都是標準輸出 即輸出到終端上

我們把輸出到其他地方的操作稱之為重定向

即 >

例如cat test.sh > test2.sh 它會自己建立test2.sh並把內容寫進去

>> 不覆蓋,追加到後面 >會覆蓋

wc -l < file1.txt (wc -l是統計有幾行) 即統計file1.txt

與直接 wc -l file1.txt有什麼不一樣?(例如有4行)

有《則顯示4 沒有則顯示4 file1.txt

管道 把左邊的輸出 作為右邊的輸入

例如 ls | head -n 3

ls 顯示當前目錄下有多少個檔案 右邊的作用就是輸出當前目錄檔案下的前三個檔案

ls|head 3|tail -1| 輸出第三個 控制輸出第幾行也可以這樣

例子:gcc code.c &

; 按順序執行(分隔不同命令)

邏輯與 && 只有第乙個命令被成功執行了 第二個命令才會被執行 cp 1.sh 2.sh && rm1.sh

邏輯或 || 第乙個命令被成功執行則不執行第二個 沒有被成功執行才會執行第二個

()內就是把多個命令用;隔開 似乎不用小括號也是一樣的

而{} 裡面要在最前面加空格 並且最後乙個命令後面也要加分號

() {}有時候結果會不一樣

例如:

a=

"current value"

echo

$a#$代表變數,輸出結果是current value

#如果使用()

(a="new value"

;echo$a)

# 結果是new value

#接著echo

$a# 結果依舊是current value

#如果使用{}

# 結果是new value

#接著echo

$a# 結果已經變成了new value

小括號並不是在當前終端(程序)裡進行的,而是在新的子程序裡執行的

linux中除錯shell指令碼

原來的指令碼check.sh monfile var log test testmon.txt logfile var log test testmon.log touch monfile 該指令碼是在window裡編輯的,編輯後上傳到linux的 問題 執行後,目錄下出現的檔案是testmon.t...

Linux上shell指令碼對入參進行拼接

本例使用shift命令進行左移操作 其中不帶引數的shift命令相當於shift 1,代表左移乙個,比如shift 使得原來的 3 變成原來的 4,原來的 2變成原來的 3,示例 如下 bin bash time 20180222 author huangzx3 本指令碼為入參進行sql語句拼接例項...

Linux的shell指令碼

shell 程式設計一般指 shell 指令碼程式設計。語法 使用 vi 編輯器新建乙個檔案 hello.sh bin bash echo hello world 執行 方式1 sh hello.sh 方式2 chmod x hello.sh 使指令碼具有執行許可權 hello.sh 執行指令碼 4...