1. 程式人生 > >Linux shell基礎

Linux shell基礎

三個月 operator 塊設備 讀文件 本地變量 變量測試 計數 key 登錄

種類:cat /etc/shells 查看系統支持的shell

ash 占用資源最少的shell 只有24個內部命令。

bash linux默認使用的shell。可以使用doskey功能。可以自動補全.自帶幫組文檔。

ksh:功能很強大,支持很復雜的語法。可以直接寫遊戲。

csh:比較大的shell,符合c語言語法,基本覆蓋c語言的功能。該shell指向/bin/tcsh 。也就是說 csh就是tcsh

zch:最大的shell之一。有84條內部命令。

set 查看所有的環境變量

用戶的shell信息保存在/etc/passwd中。所以要為用戶指定新的shell,最本質的做法就是對這個文件進行修改。

修改用戶的shell:1、 usermod -s shellname username 如:usermod -s /bin/ksh xx1 2、 chsh -s shellname username

shell變量:跟windows的註冊表差不多。安劄變量的作用來分:環境變量(全局性的,無論誰登進去 都能看到)、本地變量(當前回話有效,退出會話,就會消失掉)。用set 命令查看。

技術分享當輸入一個命令的時候,會到以下目錄去搜索。

技術分享命令提示符的樣式。\u 當前登錄的用戶 \h當前登錄的主機 \w 當前的目錄所在

定義變量: abc=1234 或者 export abc=1234。當=兩邊有空格,必須用引號括起來。

創建一個shell

vi test

#!/bin/bash 註釋,哪個shell來執行。

cal 1 2017

date

w

存盤退出

執行 sh ./test

chmod a+x ./test 增加可執行屬性

./test 執行

環境變量設置

/etc/profile 對所有的shell有效

/etc/bashrc 對bash shell有效

/用戶目錄/.bashrc

/用戶目錄/.bash_profile 對用戶有效

實現 傳參數 ./a1 $1 $2 $3……

vi a1

al 1 $1

cal 2 $1

cal 3 $1

shift命令:將 參數左移的效果。

文件b的內容為

echo $1 $2 $3

shift

echo $1 $2 $3

./b a b c

執行結果

a b c

b c

將 $2左移變成$1 $3變成$2

循環控制: for while

文件a3的內容為:

for i in 1 2 3

do cal $i $1

done

執行 ./a3 2014 結果為 顯示2014年頭三個月

文件 a5 內容

for i

do cal $i 2014

done

執行 sh a5 3 5 6 結果為 顯示2014年 3、5、6月日歷。i沒有指定具體的循環機的話,就會從執行參數中獲取。

For語句

for <循環變量> [in <循環變量取值集>] do <命令清單>
done

#!/bin/bash for i
do cal $i 97 done

控制流while也是一種循環控制結構,用法是:

while <判別命令>
do <命令清單>
done

until控制流不while控制流用法類似,但作用相反。用法為:

until <判別命令>
do <命令清單>
done

if else 語句:

#!/bin/bash
if test –w /dev/lp #檢車打印機準備好了沒有
then echo Printer is ready... #顯示Printer is ready

else echo Printer is not ready...

fi

case 語句:

case <變量> in

<字符串1> ) {<命令清單1>};;

...

<字符串n> ) {<命令清單n>};;

esac

例如:

#!/bin/bash

case $1 in

China ) echo Beijing

USA ) echo Washington

British ) echo London

Russia) echo Moskow

France ) echo Paris

* ) echo Out of my knowledge

esac

break和continue語句 跳出循環

break和continue的最大區別在於,break跳出整個循環,而contiune則跳過循環的當 前循環步。也就是說忽略了接下來的語句,直接跳到下一次循環。

here文本

在shell腳本中,還可以利用所謂的“here文本”功能,即可在腳本文件中嵌入一段文檔,作為腳本中所使用的命令 的標準輸入。具體用法為:

<命令> <<!
<作為輸入的文本內容>
! 其中“!”符號也可用“EOF”、“END”等替代。例如,以下shell腳本tel可以迚行電話號碼查詢: #!/bin/bash

a7的內容為:

#在<<!! 之間的文本中查找與輸入相匹配的行。

grep $1 <<!
Huang W (020)81833222
Zhang QF (020)84185331
Liu T (010)65364321
MA QA (020)83304587
!

一般用在安裝自動化裏。比如安裝mysql,會提示一些信息,必須輸入yes或on。可以吧這些問題放到一個文檔,進行自動化安裝。

運行

sh a7 Zhang

返回結果

Zhang QF (020)84185331

在腳本中使用函數 直接使用函數名

#!/bin/bash

#function Time

Time()
{

#取出date +%R的返回值賦值給TM

TM=‘date +%R‘
echo "The system time now is ${TM}"
}
echo "now is going to the function Time"

#調用函數 Time
Time
echo "back from the funtion Time"

向函數傳遞參數 函數名 參數1 參數2

#!/bin/sh

#function func_test

func_test()

{
echo "$1" #註有雙引號是傳遞給函數的參數,沒有雙引號是 調用shell文件時的參數

}
echo "start function"

func_test china #china作為參數傳遞給func_test
echo "end of function"

從函數中返回 return

#!/bin/sh

func_test()
{
if [ "$1" = "" ];

then

echo "none input"

return 0
else
echo "$1"

return 1
fi
}
func_test $1

獲取函數返回值 用$?

#!/bin/sh

func_test()
{
if [ "$1" = "" ]; #"$1"調用函數傳進來的參數。

then

echo "none input"

return 0

else

echo "$1"

return 1

fi

}
func_test $1 #$1是 執行shell文件傳遞進來的參數

if [ $? = 0 ]; #用$?捕捉函數執行的返回值。

then

echo "ple check you input" else

echo "all is ok" fi

條件測試:

? test <表達式>

常見用法如下:

常用測試文件狀態

-e <文件名稱>:<文件名稱>指定的文件存在。

-<文件性質> <文件名稱>:此處的<文件性質>可以是:b(塊設備)、c(字符設備)、d(目錄)、f(普通文件)、L(符號鏈接)、p(管道文件)、r(可讀文件)、w(可寫文件)、s(非0字節文件)、x(可執行文件)。此表達式表示<文件名稱>所指定的文件存在並且具有指定的性質。

<文件名稱1> -nt <文件名稱2>:表示<文件名稱1>所代表的文件比<文件名稱2>所代表的文件更新。

<文件名稱1> -ot <文件名稱2>:表示<文件名稱1>所代表的文件比<文件名稱2>所代表的文件更舊。

字符串測試

常用測試字符串測試的<表達式>有:

-z <“字符串”>:字符串為空串。

-n <”字符串”>:字符串是非空串。

<字符串1> = <字符串2>:字符串1與字符串2相等。

<字符串1> != <字符串2>:字符串1與字符串2不相等。

! <表達式>:<表達式>不成立。

<表達式1> -a <表達式2>:<表達式1>與<表達式2>同時成立。

<表達式1> -o <表達式2>:<表達式1>或<表達式2>成立。

數值測試

常用於數值測試的<表達式>有:

<數值表達式1> <算符> <數值表達式2>,此處,<算符>可以是:

-eq:兩者相等。

-he:兩者不等。

-lt:前者小於後者。

-le:前者小於或等於後者。

-gt:前者大於後者。

-ge:前者大於或等於後者。

<數值表達式>可以是整數或用“-l <字符串>”來表示求字符串的長度。

expr用法

expr命令一般用於整數值,但也可用於字符串。一般格式為:

expr argument operator argument

expr也是一個手工命令行計算器,如圖所示。

技術分享

增加計數:

常常用於循環中,用法如下:

loop=0

loop=’expr $loop +1’

數值測試:

這裏的數值測試並不是上面所講到的數值測試,這裏的數值測試是檢查被測變量是否為整數。如下面:

前面我們已經定義了變量number,現在在提示符下輸入如下:

expr $number + 100 > /dev/null 2>&1

echo $?

系統返回 “0” 表示number變量為整數,自己動手用一個非整數的變量測試,觀察系統返回的數值是否非0

模式匹配:

expr也有模式匹配功能。可以使用expr match STRING REGEXP計算字符串中字符數。“. *”意即任何字符重復0次或多次,如下:

docu=blue.doc

expr match $docu ".*"

8 (系統返回)

在expr中可以使用字符串匹配操作,這裏使用模式.doc抽取文件名。如下面的命令:

expr match $value "\(.*\).doc"

blue (系統返回)

命令如下:

test -e test

echo $?

返回0表示存在。1表示不存在。 在腳本裏 不需要echo命令。

a6內容如下:

#/bin/bash

if [ $1 -eq 1 ];then

echo "\$1 is 1"

else echo "\$1 is not 1"

fi

執行 sh a6 1 結果為 $1 is 1。sh a6 sdfkj 結果為 $1 is not 1。 中括號就相當於test

練習:

1 判定一個用參數指定的文件是否為可執行,如果不是,則改為可執行

if !(test -x a)

then

echo 執行chmod

chmod a+x a

else

echo 已有可寫權限

fi

ls -l a

2 用while和until循環,實現輸出某年前9個月月歷的效果

i=1

while [ ${i} -le 9 ];

do

cal ${i} $1

let i=i+1

done

i=1

until [ ${i} -gt 9 ];

do

cal ${i} $1

let i=i+1

done

3 使用here文檔寫一個腳本,來實現刪除某個指定文件時不用回答yes or no而直接刪除,限定不能使用rm的-f開關

#!/bin/bash

rm -i $1 <<!

y

!

4、寫一個腳本,可以輸出用參數指定的年,以及該年中某幾個用參數指定的月的月歷,月的個數是不固定的

i=1

while [ ${i} -le $2 ];

do

cal ${i} $1

let i=i+1

done

Linux shell基礎