shell腳本
shell腳本執(zhí)行
- chmod +x xx.sh ;./xx.sh
- 注意點(diǎn):最好使用第一種
注釋
:代表單行注釋
shell腳本是一個(gè)弱類型的語言
- 不需要指定數(shù)據(jù)類型
- 如果變量沒有定義,那么這變量默認(rèn)為空
- 如果shell腳本文件某一行出錯(cuò),不會影響我整個(gè)程序的運(yùn)行
標(biāo)識符的命名規(guī)范
- 硬件規(guī)范
- 不能數(shù)字開頭
- 只能由字母,下劃線,數(shù)字構(gòu)成
- 不能與shell腳本的關(guān)鍵字相同if printf echo case等
- 建議:
- 不準(zhǔn)用拼音,多查字典
- 建議使用駝峰命名規(guī)范numOfStudent
- 見名知義
變量的定義
- 變量=值
- 注意點(diǎn):變量一定義出來,就必須給他一個(gè)值,否則語法錯(cuò)誤
- =號左右兩邊不能有空格
- 如果右邊是字符串,用""括起來
- 變量的使用
- 以$符號開頭
echo簡單用法
- echo:表明輸出命令,輸出echo后面的內(nèi)容,會自動換行
- echo后面是否加"",'',不加;
- 加''里面寫什么輸出什么;例如value="hello"
echo '$value';輸出結(jié)果是$value- 不加;降低程的可讀性
- 加"";能避免上面兩個(gè)缺點(diǎn)
- value="hello"
echo "{$value}1"
加{},不是(),為了分清變量
shell轉(zhuǎn)義字符
- \n:代表換行
- \t:相當(dāng)于敲了一個(gè)tab鍵的寬度
echo -e開啟轉(zhuǎn)義
- 如果是./xx.sh運(yùn)行shell腳本,必須開啟轉(zhuǎn)義; value="hello"
echo "$value\n"是不會換行- 開啟轉(zhuǎn)義對特殊字符進(jìn)行處理
echo -e "${value}\n"- 如果是sh xx.sh運(yùn)行shell腳本,不需要開啟轉(zhuǎn)義
value="hello"
echo "${value}\n"是會換行的
變量的刪除
- unset:unset 刪除變量,不需要加$例如
value=9
echo "$value1"
unset value1
echo "value1"
輸出為:9空
unset刪除變量,刪除的變量默認(rèn)為空
只讀變量
- readonly value=7,表明這個(gè)變量將來不能被重新賦值
- readonly修飾的變量不能被unset刪除
字符串相關(guān)處理方法
- 計(jì)算字符串長度
value="hello"
length=${#value}
echo "${length}"
- 字符串拼接
value1="hello"
value2="world"
value3="${value1} ${value2}"
echo "${value3}"
3.字符串截取
value1="hello world"
value2=${value1:6:5}
#字符串從0開始艺蝴,:6代表從0開始數(shù)到第6位開始裁挫鸽,:5為截取的長度
printf
value="hello"
printf "value=%s\n"
"${value}"
- 用法:printf是輸出""里面的內(nèi)容;
%s:是一個(gè)占位符,嚴(yán)格意義上來說是輸出字符串類型的- %f:是一個(gè)占位符,后面必須是小數(shù)類型的數(shù)值占位
- %d:是一個(gè)占位符,后面必須是整數(shù)類型的數(shù)值占位
- %c:是一個(gè)占位符,后面必須是字符類型的數(shù)值占位
- \n:轉(zhuǎn)義字符
- 如果想用printf同時(shí)輸出多個(gè)變量的值
value="hello"
value1=8
printf "value=%s\nvalue1=%d\n" "${value}" "${value1}"
- %.3f:表明小數(shù)點(diǎn)后面保留3位
- %6.3f:6表明整個(gè)數(shù)據(jù)所占寬度為6個(gè)字
- %m.nf:右對齊
- 如果m<=n+1+整數(shù)實(shí)際所占個(gè)數(shù),m無效
- 如果m>n+1+整數(shù)實(shí)際所占個(gè)數(shù),m才會出現(xiàn)一定的效果
- %-m.nf:左對齊
- %md:
- %ms:
- %mc:
read
printf "請輸入一個(gè)值"
read value
printf "這個(gè)值為%s\n" "${value}"
- 用法:鍵讀入一個(gè)值,賦給read
- 注意:read盡量不要使用同時(shí)輸入多個(gè)值,比如read value1 value2
運(yùn)算符
- 算數(shù)運(yùn)算+ - * / %
- 注意點(diǎn):expr是計(jì)算整數(shù)類型行的數(shù)據(jù)
- 運(yùn)算符左右兩邊都必須要有空格
- ``和$()都是取結(jié)果集
- 注意乘法*必須要通過轉(zhuǎn)義*,不然出錯(cuò)
num1=1
num2=2
num3=`expr $num1 \* $num2`
echo "${num3}"
num1=1
num2=2
num3=`expr $num1 + $num2`
echo "${num3}"
- `` 和$()不但可以取整數(shù)運(yùn)算的結(jié)果集,還可以去shell命令結(jié)果集,比如:result=$(ls),但是兩者后都要有expr
- num1%num2求num1/num2=商……余
num1=1
num2=2
num3=$(expr $num1 % $num2)
echo "${num3}"
- !:表示取反
echo "請輸入一個(gè)數(shù):"
read num
if [ ! $num -gt 8 ]
then
echo "<=8"
else
echo ">8"
fi
- &&:表示并且
- 第一種寫法
echo "請輸入一個(gè)數(shù):\n"
read num
if [ `expr $num % 5` == 0 ]&&[ `expr $num % 3`==0 ]
then
echo "這是3,5的倍數(shù)"
else
echo "這不是3,5的倍數(shù)"
fi
- 用法:事件1&&事件2:事件1成立并且事件2成立,整個(gè)事件才成立,否則整個(gè)事件不成立
- 事件1||事件2:兩個(gè)事件只要有一個(gè)事件成立,整個(gè)事件就成立
- 第二種寫法
echo "請輸入一個(gè)數(shù):\n"
read num
if [[ `expr $num % 5` == 0 && `expr $num % 3`==0 ]]
then
echo "這是3,5的倍數(shù)"
else
echo "這不是3,5的倍數(shù)"
fi
- 第三種用法
printf "請輸入一個(gè)年份:\n"
read year
if [ `expr $year % 4` == 0 -a `expr $year % 100` != 0 ] || [ `expr $year % 400` == 0 ]
then
echo "是閏年"
else
echo "不是閏年"
fi
- ||:表示或者
printf "請輸入一個(gè)年份:\n"
read year
if [[ `expr $year % 4` == 0 && `expr $year % 100` != 0 ]] || [ `expr $year % 400` == 0 ]
then
echo "是閏年"
else
echo "不是閏年"
fi
let關(guān)鍵字
- 注意點(diǎn):用了let之后 恋沃, let num3=$num1+$num2是錯(cuò)誤的伍掀,let num3=num1+num2才是正確的
num1=1
num2=2
let num3=num1+num2
echo "${num3}"
用在哪些的運(yùn)算符:
- 算數(shù)運(yùn)算符:+ - * / % ++ --
- 賦值運(yùn)算符:+= -= *= /= %=
- 后綴++
num1=1
let num3=num1++
echo "${num3}"
echo "${num1}"
- 結(jié)果為:1 2
- 前綴++
num1=1
let num3=++num1
echo "${num3}"
echo "${num1}"
- 結(jié)果為:2 2
- 后綴--
num1=1
let num3=num1--
echo "${num3}"
echo "${num1}"
- 結(jié)果為:1 0
- 前綴--
num1=1
let num3=--num1
echo "${num3}"
echo "${num1}"
- 結(jié)果為: 0 0
整數(shù)之間的關(guān)系運(yùn)算符
- < > >= <= != ==
- 在關(guān)系運(yùn)算符中,運(yùn)算的結(jié)果是一個(gè)邏輯值,如果關(guān)系表達(dá)式成立,邏輯值為1;否則為0
- <, > ,>= ,<=都必要用\進(jìn)行轉(zhuǎn)義
- !=可以用\進(jìn)行轉(zhuǎn)義,也可不用\轉(zhuǎn)義
num1=1
num2=2
num3=`expr $num1 != $num2`
echo "${num3}"
- 結(jié)果為1
- = ,\ =,\ ==, ==(根據(jù)編譯器決定)maco0s支持=,\ =
條件語句
- 如果一個(gè)數(shù)大于5,然后輸出這個(gè)數(shù),否則 如果這個(gè)數(shù)小于五,然后說明這個(gè)數(shù)小5
if[]
then
語句體;
fi
- 注意點(diǎn):[]左右兩邊都要有空格
- 關(guān)系運(yùn)算符用-gt...表示
printf "請輸入一個(gè)數(shù)"
read num
if [ $num -gt 5 ]
then
echo "${num}"
fi
- -gt:>
- -ge:>=
- -lt:<
- -le:<=
- -eq:==
- -ne:!=
- 字母含義
- g:greater
- t:then
- e:equal
- n:not
if []
then
語句體1
elif []
then
語句體
fi
if []
then
語句體1
elif []
then
語句體2
else
語句3
fi
- 注意點(diǎn):else可以沒有,如果有else,必須放在最后面,else下是沒有then
- elif可以沒有,必須放在if else中間任何位置
- if語句只能執(zhí)行一個(gè)分支
- if的結(jié)束標(biāo)志fi
字符串運(yùn)算符
- =判斷字符串是否相等
- !=判斷字符串是否不相等
- -z:zero,判斷字符串是否為空(沒有字符)或著是不存在或者字符都是空格
printf "請輸入兩個(gè)整數(shù):"
read num1
read num2
if [ $num1 -gt $num2 ]
then
printf "最大值為%s\n" "${num1}"
else
printf "最大值為%s\n" "${num2}"
fi
string1="hello"
if [ -z $string1 ]
then
echo "字符串為空"
else
echo "字符串不為空"
fi
- 結(jié)果為不為空
文件運(yùn)算符
- -d:表示判斷是否是目錄文件
- -f:表示判斷是否是普通文件
- -r:判斷文件是否可讀
- -w:判斷文件是否可寫
- -x:判斷文件是否可執(zhí)行
- -e:判斷文件是否存在
file="1.sh"
if [ -d $file ]
then
echo "目錄文件"
else
echo "不是目錄文件"
fi
結(jié)果是:不是目錄文件
file="1.sh"
if [ -f $file ]
then
echo "是普通文件"
else
echo "不是普通文件"
fi
- 結(jié)果為普通文件
file="11"
if [ -f $file ]
then
echo "是普通文件"
else
echo "不是普通文件"
fi
- 結(jié)果為不是普通文件
file="1.sh"
if [ -e $file ]
then
echo "存在"
else
echo "不存在"
fi
- 結(jié)果為存在
file="share"
if [ -e $file ]
then
echo "已存在這個(gè)目錄文件"
else
cd
mkdir "share"
fi
case
case 變量 in
值1))
語句體
;;
值2))
語句體
;;
esac
echo "請輸入一個(gè)值"
read num
case $num in
1)
echo "1"
;;
2)
echo "2"
;;
*)
echo "其他"
esac
- 注意點(diǎn):結(jié)束標(biāo)志必須是esac
- 值1)和值2)可以相同
- 如果值1)和值2)條件都不滿足蛀缝,這是會來到*)
- *) 你可以不寫,但是如果要寫就寫在最后
- 沒一個(gè)分支結(jié)束之后都有一個(gè) ;;
數(shù)組
- 數(shù)組初始化:一個(gè)變量一個(gè)變進(jìn)行初始化
array1[0]=8
array1[1]=9
- 注意點(diǎn):一個(gè)一個(gè)變量進(jìn)行初始化,可以間隔賦值還可以不從位置0開始.比如
array1[1]=7
array1[5]=8
- 整體數(shù)組賦值
- array={1 2 3 4 hello}
- 數(shù)組元素訪問
- ${數(shù)組名[下標(biāo)]}
- 遍歷數(shù)組名里面所有的元素
- ${數(shù)組命[*]
- ${數(shù)組名[@]}
while循環(huán)
while []
do
語句體
done
sum=0
i=1
while [ $i -le 100 ]
do
let sum=sum+i
let i++
done
echo "sum=${sum}"
- sum為5050,i為101
- 求1~100的偶數(shù)和
sum=0
i=1
while [ $i -le 100 ]
do
if [ `expr $i % 2` -eq 0 ]
then
let sum=sum+i
fi
let i++
done
echo "sum=${sum}"
- 結(jié)果為sum=2550
- 練習(xí)2:9x9乘法表
i=1
j=1
while [ $i -lt 10 ]
do
j=1
while [ $j -le $i ]
do
let k=i*j
printf "%d*%d=%2d " "${i}" "${j}" "${k}"
let j++
done
printf "\n"
let i++
done
- 練習(xí)3:輸入兩個(gè)整數(shù)和一個(gè)運(yùn)算符,根據(jù)運(yùn)算符計(jì)算結(jié)果
printf "請輸入兩個(gè)整數(shù):"
printf "請輸入運(yùn)算符:"
read num1
read num2
read ch
case $ch in
"*")
printf "%d*%d=%d" "${num1}" "${num2}" "$((num1*num2))"
;;
"/")
printf "%d/%d=%d" "${num1}" "${num2}" "$((num1/num2))"
;;
"+")
printf "%d+%d=%d" "${num1}" "${num2}" "$((num1+num2))"
;;
"-")
printf "%d-%d=%d" "${num1}" "${num2}" "$((num1-num2))"
;;
*)
printf "其他字符\n"
esac
參數(shù)
- ./xx.sh
- $0:代表執(zhí)行的文件./xx.sh
- $1:代表執(zhí)行的第一個(gè)參數(shù)
- $2:代表執(zhí)行的第二參數(shù)
- $n:代表執(zhí)行的第二個(gè)參數(shù)
- $#:代表執(zhí)行參數(shù)個(gè)數(shù),不包括命令本身
- 判斷是否有參數(shù),參數(shù)是否為1
- 判斷文件是否存在
- 如果存在,判斷文件是否是普通文件
- 改權(quán)限
4.運(yùn)行- 讓這個(gè)命令在全局有效
for循環(huán)
- 格式
for 變量 in 參數(shù)列表
do
done
- 用法解釋:參數(shù)列表為變量一次一次的賦值
value=`ls`
for file in $value
do
echo "${file}"
done
for value in 1 2 3 4 5
do
echo "${value}"
done
break
- break:是跳出整個(gè)循環(huán)
i=1
sum=0
while [ $i -le 100 ]
do
if [ $sum -gt 55 ]
then
break
fi
let sum+=i
let i++
done
echo "sum=${sum}"
echo "i=${i}"
- 結(jié)果為:sum=66,i=12
- 分析:當(dāng)i=11,sum>55,不成立sum=55
sum=sum+i,sum=55+11 ,i=12
- 用法:當(dāng)碰到break時(shí),直接跳出循環(huán),break下面的語句不會被執(zhí)行
- break只跳出最近的一循環(huán)
- break只能用在循環(huán)中
count=0
while [ $count -le 1 ]
do
i=1
sum=0
while [ $i -le 100 ]
do
if [ $sum -gt 55 ]
then
break
fi
let sum+=i
let i++
done
let count++
echo "sum=${sum}"
echo "i=${i}"
done
- 結(jié)果為 sum=66,i=12;sum=66,i=12
continue
i=1
sum=0
while [ $i -le 20 ]
do
if [ `expr $i % 10 ` == 3 ]
then
let i++
continue
fi
let sum+=i
let i++
done
echo "sum=${sum}"
- 分析:i=3時(shí),i條件成立,執(zhí)行continue,那么continue以下的語句就不被執(zhí)行,繼續(xù)返回到while判斷的語句看條件是否成立,如果成立繼續(xù)執(zhí)行
- 用法:當(dāng)碰到continue時(shí),跳出本層循環(huán)的當(dāng)前一次循環(huán)continue以下面的語句不會被執(zhí)行
- continue只能用循環(huán)中