- 首先看一個簡單的shell程序
#!/bin/sh
#This is to show what a example looks like.
echo "Our first example"
echo # This inserts an empty line in output.
echo "We are currently in the following directory."
/bin/pwd
echo
echo "This directory contains the following files"
/bin/ls
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
- 位置變量和特殊變量
例如:
ls -l file1 file2 file3
$0 這個程序的文件名 ls -l
$n 這個程序的第n個參數值,n=1-9
- 特殊變量
$# 這個程序的參數個數
$$ 這個程序的PID
$! 執行上一個後臺命令的PID
$? 執行上一個命令的返回值
- shell命令
#! /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 $var1 - 5
expr $var1 / $var2
expr $var3 \* 10
expr `expr 5 + 7`/$var4
將運算結果賦予變量:
var4=` expr $var1 / $var2 `
#!/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 測試條件
測試範圍:整數、字符串、文件
字符串測試:
test str1=str2 測試字符串是否相等
test str1 測試字符串是否不爲空
test -n str1 測試字符串是否不爲空
test -z str1 測試字符串是否爲空
整數測試:
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 測試整數是否不相等
文件測試:
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 ]
#!/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
- 流控制語句
exit語句:退出程序執行,並返回一個返回碼,返回碼爲0表示正常退出,非0表示非正常退出。
例如:exit 0
#!/bin/sh
if [ -x /etc/rc.d/init.d/httpd ]
then
/etc/rc.d/init.d/httpd restart
fi
命令1
elif 條件2 then
命令2
else
命令3
fi
-a:邏輯與,僅當兩個條件都成立時,結果爲真。
-o:邏輯或,兩個條件只要有一個成立,結果爲真。
echo "please input a file name:"
read file_name
if [ -d $file_name ]
then
echo "$file_name is a directory"
elif [ -f $file_name ]
then
echo "$file_name is a common file"
elif [ -c $file_name -o -b $file_name ]
then
echo "$file_name is a device file“
else
echo "$file_name is an unknown file"
fi
格式:for 變量 in 名字表
do
命令列表
done
#!/bin/sh
for DAY in Sunday Monday Tuesday Wednesday
Thursday Friday Saturday
do
echo "The day is : $DAY"
done
do
command 1
... ...
command n
done
case 變量 in
字符串1) 命令列表1
;;
...
字符串n) 命令列表n
;;
esac
while 條件
do
命令
done
#! /bin/sh
num=1
while [ $num -le 10 ]
do
SUM=`expr $num \* $num`
echo $SUM
num=`expr $num + 1`
done
until語句,格式:
until 條件
do
命令
done
until類似while循環,不同的是until是條件返回值爲假時才繼續執行。
break:跳出整個循環
continue:跳過本次循環,進行下次循環
#! /bin/sh
if [ $# -le 0 ]
then
echo "Not enough parameters"
exit 0
fi
sum=0
while [ $# -gt 0 ]
do
sum=`expr $sum + $1`
shift
done
echo $sum
- 函數應用
函數名 ()
{
命令序列
}
函數的調用:不帶()
函數名 參數1 參數2 …
函數中的參數:調用函數時,可以傳遞參數,在函數中用$1、$2…來引用
- shell 腳本調試
這將執行該腳本並顯示所有變量的值。
sh -n script
不執行腳本只是檢查語法的模式,將返回所有語法錯誤。
- awk命令應用
示例:
1、檢測系統中UID爲0的用戶
awk -F: '$3==0 {print $1}' /etc/passwd
2、檢測系統中密碼爲空的用戶
awk -F: 'length($2)==0 {print $1}' /etc/shadow
轉自:[LAMP兄弟連李明老師講Linux].課件Shell編程