Linux shell基礎
種類: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基礎