編譯型語言:如 c語言 解釋型語言:shell 腳本
shell腳本的本質:shell命令的有序集合。
2.shell 編程的基本過程基本過程分為三步:
示例:
data
chmod 740 prog1.sh
#或者
chmod u x prog1.sh
prog1.sh
#結果為
prog1.sh :not found
原因是:shell在标準搜索路徑中找不到prog1.sh 4.正确的執行shell文件
./prog1.sh
#結果為
2009年 12月 16日 星期二 14:52:57 CST
shell允許用戶建立變量存儲數據,但不支持數據類型(整型,字符,浮點型),将任何賦給變量的值都解釋為一串字符 Variable = value
在這裡插入圖片描述
==注意幾點:==
變量沒有類型
=号兩邊不能加空格
變量必須是大寫
賦值的時候要用``框起來
Bourne shell有如下四種變量:
必須在兩位數邊寫上 { } ,才能正常值一一樣。
shell 程序由零或多條shell語句構成。shell語句包括三類:說明性語句,功能性語句和結構性語句。
**說明性語句 ** 以 # 号開始到該行結束,不被解釋執行 功能性語句 任意的shell命令,用戶程序或其他shell程序 結構性語句 條件測試語句,多路分支語句,循環語句,循環控制語句等。
#!/bin/sh
#
# 本程序說明
#
command_1
command_2 #command_2的語句說明
....
==read== 從标準輸入讀入一行,并賦值給後面的變量,其語法為:
read var
把讀入的數據全部賦給var
read var1 var2 var3
把讀入行中的第一個單詞(word)賦給var1 ,第二個單詞賦給var2,.....把其餘所有的詞賦給最後一個變量。 如果執行read語句時标準輸入無數據,則程序在此停留等候,直到數據的到來或被終止運行。
#!/bin/bash
echo "input a number:"
read NUM
echo $NUM
在這裡插入圖片描述
#!/bin/bashecho "input year month day:"read Y M Decho "Today is $Y-$M-$D"
==expr命令:== 算術運算命令expr主要用于進行簡單的整數運算,包括加( )、減(-)、乘(*)和求模(%)等操作。例如
$expr 12 5 \* 327$expr 3 - 8 / 2-1$num=9$sum=`expr $num \* 6`$echo $sum54
!!運算符間用空格分開!!
測試語句==test語句==
test語句可測試三種對象:
字符串 / 整數 / 文件屬性
每種測試對象都有若幹測試操作符 例如:
test "$answer" = "yes"
#變量answer的值是否為字符串yes
test $num -eq 18
#變量num的值是否為整數18
test -d tmp
#測試tmp 是否為一個目錄名
字符串測試:
s1 = s2 測試兩個字符串的内容是否完全一樣 s1 != s2 測試兩個字符串的内容是否有差異 -z s1 測試s1 字符串的長度是否為0 -n s1 測試s1 字符串的長度是否不為0
整數測試:
a - eq b 測試a 與 b是否相等 a - ne b 測試a 與 b是否不相等 a - gt b 測試a 是否大于b a - ge b 測試a 是否大于相等b a - lt b 測試a 是否小于b a - le b 測試a 是否小于等于b
#!/bin/bash
A="how"
B="hoW"
test $A = $B
echo $? //表示輸出前一個語句的結果
在這裡插入圖片描述
#!/bin/bashA="how"B="how"test $A = $Becho $? //表示輸出前一個語句的結果
相等為0(真),不等為1(假)
#!/bin/bashA="how"B="hoW"test $A = $Becho $? //表示輸出前一個語句的結果pwdecho $?ls fileecho $?
最後ls file 沒有,所以結果為2
#!/bin/bashA=99B=88test $A -ne $Becho $? //表示輸出前一個語句的結果test $A -gt $Becho $? //表示輸出前一個語句的結果
在這裡插入圖片描述
三、shell 分支語句1. 條件語句==if ..then...fi== 語法結構:
if 表達式
then 命令表
fi
#!/bin/bash
if [ $# -ne 1 ]
then
echo "usage : $0 filename"
exit
fi
if ! [ -e $1 ]
then
echo " $1 not exist"
exit
fi
if [ -d $1 ]
then
echo "$1 is a dirextory"
fi
if...then ..else..fi 語句結構為:
if 表達式
then 命令表1
else 命令表2
fi
如果表達式為真,則執行命令表1中的命令,在退出if語句;否則執行命令表2中的語句,在退出if語句。
注意:無論表達式是否為真,都有語句要執行
#!/bin/bash
if [ $# -ne 1 ]
then
echo "usage : $0 filename"
exit
fi
if ! [ -e $1 ]
then
echo " $1 not exist"
exit
fi
if [ -L $1 ]
then
echo "l"
elif [ -d $1 ]
then
echo "-"
elif [ -b $1 ]
then
echo "b"
else
echo "csp"
fi
在這裡插入圖片描述
2. 多路分支語句==case...esac== 多路分支語句case用于多重條件測試,語法結構清晰自然,
case 字符串變量 in //case語句隻能檢測字符串變量
模式1)
命令表1 //各模拟中可用文件名元字符,以右括号結束
;;
模式2 | 模式3)
命令表2
;; //命令表以單獨的雙分号行結束,退出case語句
.....
模式n)
命令表n
;; //模式n常寫為字符*,表示所有其他模式
esac //最後一個雙分号行可以省略
判斷選擇——多路分支語句 示例1:
#!/bin/bash
echo -n "please choose (yes | no)?"
read R
case $R in
yes | Yes |y | Y |YES )
echo "yes"
;;
no)
echo "no"
;;
*)
echo "wrong"
#;;
esac
判斷成績——多路分支語句 示例2:
#!/bin/bashecho -n "please choose (yes | no)?"read Sif [ $S -lt 0 -o $S -gt 100]then echo "no in [0-100]"exit fiG=`expr $S / 10`case $G in9|10)echo "$S A";; 6|7|8)echo "$S B";;*)echo "$S C"#;;esac
在這裡插入圖片描述
四、shell 循環語句1. 循環語句for的用法當循環次數已經知道或确定時候,使用for循環語句來多次執行一條或者一組命令,循環體由語句括号do和done來限定。
格式為:
for 變量名 in 單詞表
do
命令表
done
變量依次取單詞表中的各個單詞,每取一次單詞,就執行一次循環體中的命令。循環次數由單詞數确定。命令表中的命令可以是一條,也可以是由分号或換行符分開的多條。 如果單詞表是命令行上的所有位置參數時,可以在for
實例代碼:
#!/bin/bash
#for I in `ls /etc`
do
echo "$I"
done
在這裡插入圖片描述
==seq命令== :列出一系列的數字 seq 起始數字 中間分量 終止分量
#!/bin/bash
for I in `seq 1 2 10`
do
echo "$I"
done
示例:拷貝當前目錄下的所有文件到backup子目錄下。 使用語法為:./prog5.sh[filename]
#The statement of for ....do...done
if [! -d $HOME/backup ]
then
mkdir $HOME/backup
fi
flist=`ls`
for file in $flist //flist的值是ls的執行結果即當前目錄下的文件名
do
if [ $# = 1 ]
then
if [ $1 = $file ] //命令行上有一個參數時
then
echo "$file found" ; exit
fi
else
cp $file $HOME/backup
echo "$file copied"
fi
done
echo ***Backup Completed******
語法結構:
while 命令或表達式
do
命令表
done
while語句首先測試其後的命令或表達式的值,如果為真,就執行一次循環體中的命令,然後再測試該命令或表達式的值,執行循環體,直到該命令或表達式為假時退出循環。
示例:
#!/bin/bash
I=0
while [ $I -lt 5 ] //-lt = <
do
I=`expr $I 1`
echo -n "input score:"
read $S
case `expr $S / 10` in
9|10)
echo "A"
;;
6|7|8)
echo "B"
;;
*)
echo "C"
;;
esac
echo "$I"
done
==break 和 continue==
break n 則跳出n層; continue語句則馬上轉到最近的一層循環語句的下一輪循環上, continue n 則轉到最近n層循環語句的下一輪循環上。
用法:prog7 整數 整數 整數 ... 參數個數不确定,範圍為1-10個 ,每個參數都是正整數。
示例:
#!/bin/bash
if [ $# -ne 5 ]
then
echo "argument 5"
exit
fi
for I
do
if [ `expr $I % 2` -eq 1 ]
then
echo "$I"
else
break
fi
done
若是break 的話 ,跳出整個循環。遇到偶數就跳出循環。
#!/bin/bashif [ $# -ne 5 ]then echo "argument 5"exitfifor Idoif [ `expr $I % 2` -eq 1 ]thenecho "$I"elsecontinuefidone
若是continue的話 ,跳出當前循環。遇到偶數就跳出當前循環,繼續執行下面語句
函數調用格式:
方式1:
value_name=`function_name [arg1 arg2 ...]`
函數的所有标準輸出都傳遞給了主程序的變量
方式2:
function_name [arg1 arg2 ...]
echo $?
獲取函數的返回狀态
獲取函數的返回狀态 ——示例:
grep_user()
{
R=`grep "$1" /etc/passwd | wc -l`
echo $R
return $R
}
echo -n "input username:"
read USER
grep_user $USER
RET=$?
if [ $USER -eq 1 ]
then
echo "$USER exist"
else
echo "$USER not exist"
fi
若改為不返回值,用變量,函數的所有标準輸出都傳遞給了主程序的變量
grep_user(){R=`grep "$1" /etc/passwd | wc -l`echo $R}echo -n "input username:"read USERRET=`grep_user $USER`echo "----return $RET-----"if [ $USER -eq 1 ]then echo "$USER exist"elseecho "$USER not exist"fi
在這裡插入圖片描述
2. 函數變量作用域
grep_user()
{
B=200
A=100
}
grep_user
echo "end: $A-$B"
結果發現函數内的變量,竟然是全局變量
如果我們要局部變量就 加一個local
grep_user()
{
B=200
local A=100
}
grep_user
echo "end: $A-$B"
在這裡插入圖片描述
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!