shell基礎(chǔ)知識

shell腳本

shell腳本執(zhí)行

  • chmod +x xx.sh ;./xx.sh
  • 注意點(diǎn):最好使用第一種

注釋

  • :代表單行注釋

shell腳本是一個(gè)弱類型的語言

  1. 不需要指定數(shù)據(jù)類型
  2. 如果變量沒有定義,那么這變量默認(rèn)為空
  3. 如果shell腳本文件某一行出錯(cuò),不會影響我整個(gè)程序的運(yùn)行

標(biāo)識符的命名規(guī)范

  • 硬件規(guī)范
  1. 不能數(shù)字開頭
  2. 只能由字母,下劃線,數(shù)字構(gòu)成
  3. 不能與shell腳本的關(guān)鍵字相同if printf echo case等
  • 建議:
  1. 不準(zhǔn)用拼音,多查字典
  2. 建議使用駝峰命名規(guī)范numOfStudent
  3. 見名知義

變量的定義

  1. 變量=值
  • 注意點(diǎn):變量一定義出來,就必須給他一個(gè)值,否則語法錯(cuò)誤
  • =號左右兩邊不能有空格
  • 如果右邊是字符串,用""括起來
  1. 變量的使用
  • 以$符號開頭

echo簡單用法

  1. echo:表明輸出命令,輸出echo后面的內(nèi)容,會自動換行
  2. echo后面是否加"",'',不加;
  • 加''里面寫什么輸出什么;例如value="hello"
    echo '$value';輸出結(jié)果是$value
  • 不加;降低程的可讀性
  • 加"";能避免上面兩個(gè)缺點(diǎn)
  • value="hello"
    echo "{$value}1"
    加{},不是(),為了分清變量

shell轉(zhuǎn)義字符

  1. \n:代表換行
  2. \t:相當(dāng)于敲了一個(gè)tab鍵的寬度

echo -e開啟轉(zhuǎn)義

  1. 如果是./xx.sh運(yùn)行shell腳本,必須開啟轉(zhuǎn)義; value="hello"
    echo "$value\n"是不會換行
  2. 開啟轉(zhuǎn)義對特殊字符進(jìn)行處理
    echo -e "${value}\n"
  3. 如果是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)為空

只讀變量

  1. readonly value=7,表明這個(gè)變量將來不能被重新賦值
  2. readonly修飾的變量不能被unset刪除

字符串相關(guān)處理方法

  1. 計(jì)算字符串長度
 value="hello"
length=${#value}
echo "${length}"
  1. 字符串拼接
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)義字符
  1. 如果想用printf同時(shí)輸出多個(gè)變量的值
value="hello"
value1=8
printf "value=%s\nvalue1=%d\n" "${value}" "${value1}"
  1. %.3f:表明小數(shù)點(diǎn)后面保留3位
  2. %6.3f:6表明整個(gè)數(shù)據(jù)所占寬度為6個(gè)字
  3. %m.nf:右對齊
  • 如果m<=n+1+整數(shù)實(shí)際所占個(gè)數(shù),m無效
  • 如果m>n+1+整數(shù)實(shí)際所占個(gè)數(shù),m才會出現(xiàn)一定的效果
  1. %-m.nf:左對齊
  2. %md:
  3. %ms:
  4. %mc:

read

printf  "請輸入一個(gè)值"
read value
printf "這個(gè)值為%s\n" "${value}"
  1. 用法:鍵讀入一個(gè)值,賦給read
  2. 注意:read盡量不要使用同時(shí)輸入多個(gè)值,比如read value1 value2

運(yùn)算符

  1. 算數(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

  • &&:表示并且
  1. 第一種寫法
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è)事件就成立
  1. 第二種寫法
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. 第三種用法
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)算符:+= -= *= /= %=
  1. 后綴++
num1=1
let num3=num1++
echo "${num3}"
echo "${num1}"
  • 結(jié)果為:1 2
  1. 前綴++
num1=1
let num3=++num1
echo "${num3}"
echo "${num1}"
  • 結(jié)果為:2 2
  1. 后綴--
num1=1
let num3=num1--
echo "${num3}"
echo "${num1}"
  • 結(jié)果為:1 0
  1. 前綴--
num1=1
let num3=--num1
echo "${num3}"
echo "${num1}"
  • 結(jié)果為: 0 0

整數(shù)之間的關(guān)系運(yùn)算符

  • < > >= <= != ==
  1. 在關(guān)系運(yùn)算符中,運(yùn)算的結(jié)果是一個(gè)邏輯值,如果關(guān)系表達(dá)式成立,邏輯值為1;否則為0
  2. <, > ,>= ,<=都必要用\進(jìn)行轉(zhuǎn)義
  3. !=可以用\進(jìn)行轉(zhuǎn)義,也可不用\轉(zhuǎn)義
num1=1
num2=2
num3=`expr $num1 != $num2`
echo "${num3}"
  • 結(jié)果為1
  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
  1. 注意點(diǎn):else可以沒有,如果有else,必須放在最后面,else下是沒有then
  2. elif可以沒有,必須放在if else中間任何位置
  3. if語句只能執(zhí)行一個(gè)分支
  4. 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

  1. 注意點(diǎn):結(jié)束標(biāo)志必須是esac
  2. 值1)和值2)可以相同
  3. 如果值1)和值2)條件都不滿足蛀缝,這是會來到*)
  4. *) 你可以不寫,但是如果要寫就寫在最后
  5. 沒一個(gè)分支結(jié)束之后都有一個(gè) ;;

數(shù)組

  1. 數(shù)組初始化:一個(gè)變量一個(gè)變進(jìn)行初始化
array1[0]=8
array1[1]=9
  • 注意點(diǎn):一個(gè)一個(gè)變量進(jìn)行初始化,可以間隔賦值還可以不從位置0開始.比如
array1[1]=7
array1[5]=8

  1. 整體數(shù)組賦值
  • array={1 2 3 4 hello}
  1. 數(shù)組元素訪問
  • ${數(shù)組名[下標(biāo)]}
  1. 遍歷數(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. 求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
  1. 練習(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

  1. 練習(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
  1. $0:代表執(zhí)行的文件./xx.sh
  2. $1:代表執(zhí)行的第一個(gè)參數(shù)
  3. $2:代表執(zhí)行的第二參數(shù)
  4. $n:代表執(zhí)行的第二個(gè)參數(shù)
  5. $#:代表執(zhí)行參數(shù)個(gè)數(shù),不包括命令本身
  1. 判斷是否有參數(shù),參數(shù)是否為1
  2. 判斷文件是否存在
  3. 如果存在,判斷文件是否是普通文件
  4. 改權(quán)限
    4.運(yùn)行
  5. 讓這個(gè)命令在全局有效

for循環(huán)

  1. 格式
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
  1. 用法:當(dāng)碰到break時(shí),直接跳出循環(huán),break下面的語句不會被執(zhí)行
  2. break只跳出最近的一循環(huán)
  3. 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í)行
  1. 用法:當(dāng)碰到continue時(shí),跳出本層循環(huán)的當(dāng)前一次循環(huán)continue以下面的語句不會被執(zhí)行
  2. continue只能用循環(huán)中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阎毅,隨后出現(xiàn)的幾起案子焚刚,更是在濱河造成了極大的恐慌,老刑警劉巖扇调,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矿咕,死亡現(xiàn)場離奇詭異,居然都是意外死亡狼钮,警方通過查閱死者的電腦和手機(jī)碳柱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熬芜,“玉大人莲镣,你說我怎么就攤上這事∠牙” “怎么了瑞侮?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鼓拧。 經(jīng)常有香客問我半火,道長,這世上最難降的妖魔是什么季俩? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任量蕊,我火速辦了婚禮,結(jié)果婚禮上舒萎,老公的妹妹穿的比我還像新娘致燥。我一直安慰自己,他們只是感情好赂韵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布娱节。 她就那樣靜靜地躺著,像睡著了一般祭示。 火紅的嫁衣襯著肌膚如雪肄满。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音稠歉,去河邊找鬼掰担。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怒炸,可吹牛的內(nèi)容都是我干的带饱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阅羹,長吁一口氣:“原來是場噩夢啊……” “哼勺疼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捏鱼,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤执庐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后导梆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轨淌,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年看尼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猿诸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狡忙,死狀恐怖梳虽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灾茁,我是刑警寧澤窜觉,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站北专,受9級特大地震影響禀挫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拓颓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一语婴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驶睦,春花似錦砰左、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溉痢,卻和暖如春僻造,著一層夾襖步出監(jiān)牢的瞬間憋他,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工髓削, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竹挡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓立膛,卻偏偏與公主長得像揪罕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子旧巾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 0.linux啟動的步驟 設(shè)備加電----》BIOS自檢-----》grub引導(dǎo)啟動-----》加載內(nèi)核----》...
    萌面大叔2閱讀 779評論 0 1
  • 一耸序、shell腳本介紹 1.1 開頭(環(huán)境使用shebang機(jī)制) #忍些!/bin/bash 必須寫在文件首行 符號...
    優(yōu)果馥斯閱讀 3,294評論 0 1
  • 什么是linux linux可以為我們做什么 打游戲下軟件聽音樂 系統(tǒng)服務(wù)器 連接Internet 網(wǎng)絡(luò)使用lin...
    帥碧閱讀 1,001評論 1 6
  • 個(gè)人學(xué)習(xí)批處理的初衷來源于實(shí)際工作鲁猩;在某個(gè)迭代版本有個(gè)BS(安卓手游模擬器)大需求,從而在測試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,718評論 0 11
  • 自我控制罢坝,不要捆綁廓握,不要束縛,共性和吸引才是長久的相處之道20160111
    馬女閱讀 117評論 0 0