一朴皆、昨日回顧:
遺留問題:
#!/bin/bash
tring=“Hello,World!”
printf "%s\n" $string
printf "%s" "Hello,World!"
echo “================”
printf "%s" Hello,World
printf "%s\n" “$string”
printf打印字符串:若變量值中有空格帕识,則打印時(shí)應(yīng)使用 "$變量名"。
字符串賦值時(shí)遂铡,若值中有空格肮疗,用 “” 括起來。
$引用變量不能吧“”一起引用扒接,因此打印時(shí)族吻,需用“$變量名”。
三種寫法:
$string ${string} "$string"
二珠增、今日內(nèi)容
1.字符串
(1)字符串的拼接
str="$string $string1"
引用字符串的值超歌,并將多個(gè)字符串的值作為新的字符串賦給新變量。
#!/bin/bash
#字符串的拼接
string1="hello"
string2="Shell!"
str="$string1 $string2"
echo $string1
echo $string2
echo "$str"
(2)字符串的長度
lenth=${#string}
注意此時(shí)的#不再是注釋蒂教,表示字符串的長度巍举。
#(接上個(gè)程序)字符串的長度
lenth1=${#string1}
lenth2=${#string2}
lenth3=${#str}
echo "$string1 :" lenth1
echo "$string2 :" lenth2
echo "$str:" lenth3
(3)字符串的分割
nstr=${string:a:b}
從字符串string的第a個(gè)字符后開始截取b個(gè)字符,附給新的變量nstr凝垛。
#(接上個(gè)程序)字符串的分割
nstr1=${string1:1:2}
nstr2=${string2:2:1}
nstr3=${str:4:5}
printf "nstr1:%\n" "$nstr1"
printf "nstr2:%\n" "$nstr2"
printf "nstr3:%\n" "$nstr3"
2.只讀:readonly
readonly num=34
echo $num
num=88 #錯(cuò)誤{error}
echo $num //只讀變量的值不可更改0妹酢!梦皮!
3.清除變量的值
#清除變量的值
num=333
echo $num
unset num
echo $num //unset 是清除變量的值炭分,若變量未定義直接使用,起值為空剑肯。
4.再次強(qiáng)調(diào)
(1)Shell程序必須指定腳本的解釋程序捧毛, 即在Shell腳本程序的第一行必須是:
#!/bin/bash
(2)空格問題
變量賦值時(shí),“=” 兩邊不可有空格。
字符串的空格問題呀忧。
其他情況:盡量加空格师痕。
5.權(quán)限問題
sudo chmod a+x read.sh //所有用戶
sudo chmod u+x,g+x read.sh //擁有者和同組用戶,用 “而账,”隔開
sudo chmod +x read.sh //所有用戶
sudo chmod 777 read.sh //所有用戶所有權(quán)限
**6.從鍵盤獲取變量值 **
read:在沒有輸入時(shí)胰坟,則等待輸入
read 變量1 變量2 變量3 //輸入時(shí),同樣輸空格隔開變量
獲取一個(gè)值給變量泞辐,(動(dòng)態(tài)決定數(shù)據(jù)類型)笔横,
將輸入的第一個(gè)值賦給變量1,第二個(gè)值賦給變量2咐吼,以此類推狠裹,
剩余的值全部賦給最后一個(gè)變量。
不建議多個(gè)變量使用一個(gè)read汽烦,read num1 num2 num3 ....。
建議一次read一個(gè)變量莉御。
read num1
read num2
read num3
7.Shell的三大語句
功能型語句撇吞、說明性語句、結(jié)構(gòu)分支語句
(1)說明型語句
以#開頭的語句礁叔,至行末均為說明性語句牍颈,說明型語句不解釋執(zhí)行(整行),即注釋琅关。
說明型語句的位置可以在程序中的任意位置煮岁,可以放在解釋執(zhí)行語句之后,從#開始的部分到行末涣易,只能注釋一行画机。
(2)功能型語句
系統(tǒng)命令,自寫程序....
(3)結(jié)構(gòu)型語句
多路分支語句新症,循環(huán)語句步氏,循環(huán)控制語句,測(cè)試語句徒爹,條件語句
8.加荚醒、減、乘隆嗅、除界阁、取余(整數(shù))
expr let:針對(duì)整數(shù)做簡(jiǎn)單的運(yùn)算
sum1=`expr $num1 + $num2` //必須要有空格
sum2=`expr $num1 \* $num2` //取得結(jié)果集,
sum1=$(expr $num1 + $num2)
sum2=$(expr $num1 \* $num2) //同上
let sum1=num1+num2
let sum2=num1\*num2 //乘法\*,\轉(zhuǎn)義字符為去掉*的元意,告訴解釋器這真的是乘法胖喳!
``:取得結(jié)果集
$():取得結(jié)果集 //兩者的執(zhí)行效果相同
-n是echo不換行輸出
9.條件測(cè)試語句
(1)test 測(cè)試語句
(2)[ 條件測(cè)試語句 ]: //注意[] 中的空格E萸!!
文件比較運(yùn)算符:
-e file:測(cè)試file是否存在
-d file:測(cè)試file是否是目錄
-f file:測(cè)試file是否是文件
-r file:測(cè)試file是否可讀
-w file:測(cè)試file是否可寫
-x file:測(cè)試file是否可執(zhí)行
算術(shù)比較運(yùn)算符:
-eq:是否相等 equal
-ne:是否不等 not equal
-gt:是否大于 greater than
-ge:是否大于等于 greater equal
-lt:是否小于 less than
-le:是否小于等于 less equal
字符串比較:
-z string:string長度是否為零
-n string:若string非零精续,為真
string=string1:是否相同
string!=string1:是否不同
邏輯操作符:
&&:邏輯與
事件1 && 事件2 //當(dāng)事件1和事件2都為真坝锰,則為真
||:邏輯或
事件1 || 事件2 //當(dāng)事件1或事件2為真,則為真
-a:and
-o:or
常見變量:
$?:命令執(zhí)行后的返回狀態(tài)重付,返回零表示執(zhí)行成功
$*:所有參數(shù)列表
$@:所有參數(shù)列表
$#:傳遞到腳本的參數(shù)個(gè)數(shù)
$0:可執(zhí)行命令本身顷级,不是位置參數(shù)
10.if語句
(1)if [ 條件 ]
then
命令
fi
(2)if [ 條件 ]
then
命令
elif [ 條件 ]
then
命令
else
命令
fi
**//參數(shù)后面可以跟路徑**
**//在終端可運(yùn)行的命令,在Shell腳本下都可運(yùn)行**
11.case語句
case 值 in
值1)
命令
;确垫;
值2)
命令
弓颈;;
*)
命令
删掀;翔冀;
esac
其中:
| //多重選擇
? //任意一個(gè)字符
* //代表多個(gè)字符
[a-z] //a至z間的任意字符披泪? 左閉右開
12.for循環(huán)
(1)for 值 in 列表
do
命令
done
(2)for 值 in 列表
do
for 值 in 列表
do
命令
done
done
方法二: //for循環(huán)值列表可以省略纤子,從
for((i=1;i<9;i++))
do
echo "j"
done
13.while循環(huán)
while [ 條件 ]
do
命令
done
老師上課給出的vi實(shí)例:
把輸入的字母分類,只要小寫拉丁字母可歸檔款票,其他的包括大寫拉丁字母都不在歸檔范圍內(nèi)控硼。
#!/bin/bash
echo -n "input string1:"
read string1
case $string1 in
[a-g]) echo "$string1 in form a to g"
;;
[h-r]) echo "$string1 in from h to r"
;;
[s-z]) echo "$string1 in from s to z"
;;
*) echo "$string1 out of the rang! "
;;
esac
但是運(yùn)行結(jié)果是部分大寫字母G,R艾少,Z依然能歸檔卡乾。
(to be continued...)