《Linux 九》Shell 講解
課程大綱 『
Shell編程語法
Shell腳本調試
Shell應用實例
』
一個簡單的shell程序
shell結構 :
1. #!指定執行腳本的shell
2. #註釋行
3. 命令和控制結構
創建shell程序的步驟:
第一步 : 創建一個包含命令和控制結構的文件。
第二步 : 修改這個文件的權限使它可以執行。
使用chmod u+x
第三步 : 執行 ./example
(也可以使用“sh example”執行)
Shell變量
變量 : 是shell傳遞數據的一種方法,用來代表每個取值的符號名。
Shell有兩類變量 : 臨時變量 和 永久變量。
臨時變量是shell程序內部定義的,其使用範圍僅限於定義它的程序,對其它程序不可見。包括:用戶自定義變
量、位置變量。永久變量是環境變量,其值不隨shell腳本的執行結束而消失。
用戶自定義變量
用戶定義的變量由字母或下劃線開頭,由字母、數字或下劃線序列組成,並且大小寫字母意義不
同。變量名長度沒有限制。在使用變量值時,要在變量名前加上前綴“$”。
設置和使用變量
設置變量 : 習慣上用大寫字母來命名變量。變量名只能以字母表中的字符開頭,不能用數字。
變量賦值 : 賦值號“=”兩邊應沒有空格。定義時賦值,如 NUM = 1 將一個命令的執行結果賦給變量,如:TIME=`date`
將一個變量賦給另一個變量,如:A =$B使用echo命令查看變量值。例如:echo $A
列出所有的變量:
# set
包含多個字的變量:
$NAME=Mike Ron
運行時出錯,應改爲 : $NAME=“Mike Ron” 或 $NAME=‘Mike Ron’
單引號和雙引號的區別 :
# $ABC=‘$NAME Junior’
# echo $ABC
$NAME Junior
單引號之間的內容原封不動地指定給了變量。
刪除變量 : # unset NAME
位置變量和特殊變量
Shell解釋執行用戶命令時,將命令行的第一個部分作爲命令名,其它部分作爲參數。由出現
在命令行上的位置確定的參數稱爲位置參數。
例如 : ls -l file1 file2 file3
$0 這個程序的文件名 ls -l
$n 這個程序的第n個參數值,n=1-9
特殊變量
$* 這個程序的所有參數
$# 這個程序的參數個數
$$ 這個程序的PID
$! 執行上一個後臺命令的PID
$? 執行上一個命令的返回值
Shell命令
*1 read命令 : 從鍵盤讀入數據,賦給變量 如 : read USERNAME
read 的例子:
#! /bin/sh
read first second third
echo "the first parameter is $first"
echo "the second parameter is $second”
echo "the third parameter is $third"
expr 命令
Shell變量的算術運算:
expr命令:對整數型變量進行算術運算
例如 : expr 3 + 5
expr $var1 - 5
expr $var1 / $var2
expr $var3 \* 10
複雜的expr命令
複雜的運算:
expr `expr 5 + 7`/$var4
將運算結果賦予變量:
var4=` expr $var1 / $var2 `
expr 命令
[plain] view plaincopy
#!/bin/sh
a=10
b=20
c=30
value1=`expr $a + $b + $c`
echo "The value of value1 is $value1"
value2=`expr $c / $b`
echo "The value of value2 is $value2"
value3=`expr $c \* $b`
echo "The value of value3 is $value3"
value4=`expr $a + $c / $b`
echo "The value of value4 is $value4“
變量測試語句
變量測試語句:用於測試變量是否相等、 是否爲空、文件類型等。
格式 : test 測試條件
測試範圍 : 整數、字符串、文件
*1 字符串測試:
test str1=str2 測試字符串是否相等
test str1!=str2 測試字符串是否不相等
test str1 測試字符串是否不爲空
test -n str1 測試字符串是否不爲空
test -z str1 測試字符串是否爲空
*2 整數測試:
test int1 -eq int2 測試整數是否相等
test int1 -ge int2 測試int1是否>=int2
test int1 -gt int2 測試int1是否>int2
test int1 -le int2 測試int1是否<=int2
test int1 -lt int2 測試int1是否<int2
test int1 -ne int2 測試整數是否不相等
*3 文件測試:
test -d file 指定文件是否目錄
test -f file 指定文件是否常規文件
test -x file 指定文件是否可執行
test -r file 指定文件是否可讀
test -w file 指定文件是否可寫
test -a file 指定文件是否存在
test -s file 文件的大小是否非0
變量測試語句一般不單獨使用,一般做爲if語句的測試條件,如:
if test -d $1 then
...
fi
變量測試語句可用[]進行簡化,如
test -d $1 等價於 [ -d $1 ]
[plain] view plaincopy
#!/bin/sh
if [ $# -ne 2 ]; then
echo "Not enough parameters"
exit 0
fi
if [ $1 -eq $2 ]; then
echo "$1 equals $2"
elif [ $1 -lt $2 ]; then
echo "$1 littler than $2"
elif [ $1 -gt $2 ]; then
echo "$1 greater than $2"
fi
流控制語句
流控制語句 : 用於控制shell程序的流程
exit語句 : 退出程序執行,並返回一個返回碼,返回碼爲0表示正常退出,非0表示非正常退出。
例如:exit 0
*1 if 的使用
if ...then ...fi語句, 例如 :
[html] view plaincopy
#!/bin/sh
if [ -x /etc/rc.d/init.d/httpd ]
then
/etc/rc.d/init.d/httpd restart
fi
*2 更復雜的if語句 :
if 條件1 then
命令1
elif 條件2 then
命令2
else
命令3
fi
*3 多個條件的聯合:
-a : 邏輯與,僅當兩個條件都成立時,結果爲真。
-o : 邏輯或,兩個條件只要有一個成立,結果爲真。
*4 for...done語句
格式:for 變量 in 名字表
do
命令列表
done
例子:
[plain] view plaincopy
#!/bin/sh
for DAY in Sunday Monday Tuesday Wednesday
Thursday Friday Saturday
do
echo "The day is : $DAY"
don
*5 select 變量 in 關鍵字
do
command 1
... ...
command n
done
select把關鍵字中的每一項做成類似表單,以交互的方式執行do和done之間的命令。
*6 case...esac語句,格式:
case 變量 in
字符串1) 命令列表1
;;
...
字符串n) 命令列表n
;;
esac
*7 while語句,格式:
[plain] view plaincopy
while 條件
do
命令
done
#! /bin/sh
num=1
while [ $num -le 10 ]
do
SUM=`expr $num \* $num`
echo $SUM
num=`expr $num + 1`
done
*8 until語句,格式:
until 條件
do
命令
done
until類似while循環,不同的是until是條件返回值爲假時才繼續執行
*9 跳出循環:break和continue
break : 跳出整個循環
continue : 跳過本次循環,進行下次循環
*10
shift指令:參數左移,每執行一次,參數序列順次左移一個位置,$#的值減1,
用於分別處理每個參數,移出去的參數不再可用
*11 函數的定義:
函數名 ()
{
命令序列
}
函數的調用:不帶()
函數名 參數1 參數2 ...
*12 函數中的變量:
變量均爲全局變量, 沒有局部變量
函數中的參數 : 調用函數時,可以傳遞參數,在函數中用$1、$2...來引用
*13 sh -x script
這將執行該腳本並顯示所有變量的值。
sh -n script
不執行腳本只是檢查語法的模式,將返回所有語法錯誤。
*14 awk命令應用
awk -F 域分隔符 ‘命令’
示例 :
1、檢測系統中UID爲0的用戶
awk -F: '$3==0 {print $1}' /etc/passwd
2、檢測系統中密碼爲空的用戶
awk -F: 'length($2)==0 {print $1}' /etc/shadow
知識點總結
掌握Shell編程的基本語法
掌握結合系統命令編寫應用腳本
掌握Shell編程調試命令
Shell編程語法
Shell腳本調試
Shell應用實例
』
一個簡單的shell程序
shell結構 :
1. #!指定執行腳本的shell
2. #註釋行
3. 命令和控制結構
創建shell程序的步驟:
第一步 : 創建一個包含命令和控制結構的文件。
第二步 : 修改這個文件的權限使它可以執行。
使用chmod u+x
第三步 : 執行 ./example
(也可以使用“sh example”執行)
Shell變量
變量 : 是shell傳遞數據的一種方法,用來代表每個取值的符號名。
Shell有兩類變量 : 臨時變量 和 永久變量。
臨時變量是shell程序內部定義的,其使用範圍僅限於定義它的程序,對其它程序不可見。包括:用戶自定義變
量、位置變量。永久變量是環境變量,其值不隨shell腳本的執行結束而消失。
用戶自定義變量
用戶定義的變量由字母或下劃線開頭,由字母、數字或下劃線序列組成,並且大小寫字母意義不
同。變量名長度沒有限制。在使用變量值時,要在變量名前加上前綴“$”。
設置和使用變量
設置變量 : 習慣上用大寫字母來命名變量。變量名只能以字母表中的字符開頭,不能用數字。
變量賦值 : 賦值號“=”兩邊應沒有空格。定義時賦值,如 NUM = 1 將一個命令的執行結果賦給變量,如:TIME=`date`
將一個變量賦給另一個變量,如:A =$B使用echo命令查看變量值。例如:echo $A
列出所有的變量:
# set
包含多個字的變量:
$NAME=Mike Ron
運行時出錯,應改爲 : $NAME=“Mike Ron” 或 $NAME=‘Mike Ron’
單引號和雙引號的區別 :
# $ABC=‘$NAME Junior’
# echo $ABC
$NAME Junior
單引號之間的內容原封不動地指定給了變量。
刪除變量 : # unset NAME
位置變量和特殊變量
Shell解釋執行用戶命令時,將命令行的第一個部分作爲命令名,其它部分作爲參數。由出現
在命令行上的位置確定的參數稱爲位置參數。
例如 : ls -l file1 file2 file3
$0 這個程序的文件名 ls -l
$n 這個程序的第n個參數值,n=1-9
特殊變量
$* 這個程序的所有參數
$# 這個程序的參數個數
$$ 這個程序的PID
$! 執行上一個後臺命令的PID
$? 執行上一個命令的返回值
Shell命令
*1 read命令 : 從鍵盤讀入數據,賦給變量 如 : read USERNAME
read 的例子:
#! /bin/sh
read first second third
echo "the first parameter is $first"
echo "the second parameter is $second”
echo "the third parameter is $third"
expr 命令
Shell變量的算術運算:
expr命令:對整數型變量進行算術運算
例如 : expr 3 + 5
expr $var1 - 5
expr $var1 / $var2
expr $var3 \* 10
複雜的expr命令
複雜的運算:
expr `expr 5 + 7`/$var4
將運算結果賦予變量:
var4=` expr $var1 / $var2 `
expr 命令
[plain] view plaincopy
#!/bin/sh
a=10
b=20
c=30
value1=`expr $a + $b + $c`
echo "The value of value1 is $value1"
value2=`expr $c / $b`
echo "The value of value2 is $value2"
value3=`expr $c \* $b`
echo "The value of value3 is $value3"
value4=`expr $a + $c / $b`
echo "The value of value4 is $value4“
變量測試語句
變量測試語句:用於測試變量是否相等、 是否爲空、文件類型等。
格式 : test 測試條件
測試範圍 : 整數、字符串、文件
*1 字符串測試:
test str1=str2 測試字符串是否相等
test str1!=str2 測試字符串是否不相等
test str1 測試字符串是否不爲空
test -n str1 測試字符串是否不爲空
test -z str1 測試字符串是否爲空
*2 整數測試:
test int1 -eq int2 測試整數是否相等
test int1 -ge int2 測試int1是否>=int2
test int1 -gt int2 測試int1是否>int2
test int1 -le int2 測試int1是否<=int2
test int1 -lt int2 測試int1是否<int2
test int1 -ne int2 測試整數是否不相等
*3 文件測試:
test -d file 指定文件是否目錄
test -f file 指定文件是否常規文件
test -x file 指定文件是否可執行
test -r file 指定文件是否可讀
test -w file 指定文件是否可寫
test -a file 指定文件是否存在
test -s file 文件的大小是否非0
變量測試語句一般不單獨使用,一般做爲if語句的測試條件,如:
if test -d $1 then
...
fi
變量測試語句可用[]進行簡化,如
test -d $1 等價於 [ -d $1 ]
[plain] view plaincopy
#!/bin/sh
if [ $# -ne 2 ]; then
echo "Not enough parameters"
exit 0
fi
if [ $1 -eq $2 ]; then
echo "$1 equals $2"
elif [ $1 -lt $2 ]; then
echo "$1 littler than $2"
elif [ $1 -gt $2 ]; then
echo "$1 greater than $2"
fi
流控制語句
流控制語句 : 用於控制shell程序的流程
exit語句 : 退出程序執行,並返回一個返回碼,返回碼爲0表示正常退出,非0表示非正常退出。
例如:exit 0
*1 if 的使用
if ...then ...fi語句, 例如 :
[html] view plaincopy
#!/bin/sh
if [ -x /etc/rc.d/init.d/httpd ]
then
/etc/rc.d/init.d/httpd restart
fi
*2 更復雜的if語句 :
if 條件1 then
命令1
elif 條件2 then
命令2
else
命令3
fi
*3 多個條件的聯合:
-a : 邏輯與,僅當兩個條件都成立時,結果爲真。
-o : 邏輯或,兩個條件只要有一個成立,結果爲真。
*4 for...done語句
格式:for 變量 in 名字表
do
命令列表
done
例子:
[plain] view plaincopy
#!/bin/sh
for DAY in Sunday Monday Tuesday Wednesday
Thursday Friday Saturday
do
echo "The day is : $DAY"
don
*5 select 變量 in 關鍵字
do
command 1
... ...
command n
done
select把關鍵字中的每一項做成類似表單,以交互的方式執行do和done之間的命令。
*6 case...esac語句,格式:
case 變量 in
字符串1) 命令列表1
;;
...
字符串n) 命令列表n
;;
esac
*7 while語句,格式:
[plain] view plaincopy
while 條件
do
命令
done
#! /bin/sh
num=1
while [ $num -le 10 ]
do
SUM=`expr $num \* $num`
echo $SUM
num=`expr $num + 1`
done
*8 until語句,格式:
until 條件
do
命令
done
until類似while循環,不同的是until是條件返回值爲假時才繼續執行
*9 跳出循環:break和continue
break : 跳出整個循環
continue : 跳過本次循環,進行下次循環
*10
shift指令:參數左移,每執行一次,參數序列順次左移一個位置,$#的值減1,
用於分別處理每個參數,移出去的參數不再可用
*11 函數的定義:
函數名 ()
{
命令序列
}
函數的調用:不帶()
函數名 參數1 參數2 ...
*12 函數中的變量:
變量均爲全局變量, 沒有局部變量
函數中的參數 : 調用函數時,可以傳遞參數,在函數中用$1、$2...來引用
*13 sh -x script
這將執行該腳本並顯示所有變量的值。
sh -n script
不執行腳本只是檢查語法的模式,將返回所有語法錯誤。
*14 awk命令應用
awk -F 域分隔符 ‘命令’
示例 :
1、檢測系統中UID爲0的用戶
awk -F: '$3==0 {print $1}' /etc/passwd
2、檢測系統中密碼爲空的用戶
awk -F: 'length($2)==0 {print $1}' /etc/shadow
知識點總結
掌握Shell編程的基本語法
掌握結合系統命令編寫應用腳本
掌握Shell編程調試命令
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.