哈哈,貓毛終于學(xué)習(xí)到 shell script 的撰寫了。在學(xué)完基礎(chǔ)的shell之后,深刻覺得認(rèn)識(shí)一些撰寫shell常用的命令以及熟悉和靈活運(yùn)用變量是非常有必要的。除此之外,還要參考大師們的script,多模仿和練習(xí)(有點(diǎn)類似編程了哈~)。學(xué)習(xí)過程中我把腳本信息都曬在文章里面了,希望我們共同進(jìn)步~~
除了剛開始Linux -- 認(rèn)識(shí)shell script中認(rèn)識(shí)的
echo外,這篇文章里又新學(xué)習(xí)了幾個(gè)有用的命令。
read讀入標(biāo)準(zhǔn)輸入date獲得時(shí)間信息(date +%Y%m%d獲取年月日)bclinux系統(tǒng)中的計(jì)算器
1.撰寫簡單的shell
1.1 對(duì)談式腳本:變量內(nèi)容由用戶決定
對(duì)談式,通過與用戶“互動(dòng)”完成操作。
這里是通過read -p來完成:
-
read命令用于從標(biāo)準(zhǔn)輸入讀取數(shù)值 -
-p后面跟提示信息,即在輸入前打印提示信息
舉例來學(xué)習(xí),vi showname.sh
#!/bin/bash
read -p "please input your first name:" firstname #提示使用者輸入,并定義變量${firstname}
read -p "please input your last name:" lastname #提示使用者輸入,并定義變量${lastname}
echo -e "\n your full name is ${firstname} ${lastname}" #結(jié)果由屏幕輸出
1.2 隨日期變化:利用date進(jìn)行文件的建立
舉例來學(xué)習(xí)
#!/bin/bash
#1.讓使用者輸入文件名,并取得fileuser這個(gè)變量:
echo -e "I will use 'touch' command to create 3 files." #顯示信息
read -p "Please input your filename:" fileuser #提示使用者輸入filename
#2.為了避免使用者隨意按Enter,利用變量功能分析檔名是否有設(shè)定
filename=${fileuser:-"filename"} # 判斷之前是否有配置過文件名(之前“變量的測試與內(nèi)容替換”中學(xué)習(xí)過)
#3.開始利用date指令來取得所需要的文檔名
date1=$(date --date='2 days ago' +%Y%m%d) #獲取2天前的年月日信息
date2=$(date --date='1 days ago' +%Y%m%d) #獲取1天前的年月日信息
date3=$(date +%Y%m%d) 獲取今日的年月日信息
file1=${filename}${date1} # 文件名以 “filename + 日期” 決定
file2=${filename}${date2}
file3=${filename}${date3}
#4.建立文檔
touch "${file1}" #使用touch命令新建文檔
touch "${file2}"
touch "${file3}"
里面涉及到變量功能的信息,忘記了可以參考??Linux 之 Bash -- shell 的變量功能(三)
1.2 數(shù)值運(yùn)算:簡單的加減乘除
這里介紹兩種計(jì)算方法:
- (1)declare -i
使用declare來定義變量的類型,當(dāng) 變量 定義成為 整數(shù) 后才能進(jìn)行加減運(yùn)算。
eg:declare -i total=${firstnu}*${secnu} - (2)$((計(jì)算式))
利用$((計(jì)算式))來進(jìn)行數(shù)值運(yùn)算。
eg:total=$((${firstnu}*${secnu}))
這里舉例來學(xué)習(xí):vi multiplying.sh,試著寫完腳本運(yùn)行一下~
#!/bin/bash
echo -e "You should input 2 numbers,I will multiplying them! \n"
read -p "first number:" firstnu
read -p "second number:" secnu
total=$((${firstnu}*${secnu}))
echo -e "\nThe result of ${firstnu} x ${secnu} is ==> ${total}"
1.3 數(shù)值運(yùn)算:透過bc計(jì)算pi
bc命令是任意精度計(jì)算器語言,通常在linux下當(dāng)計(jì)算器用,可以做基本的數(shù)學(xué)運(yùn)算
在命令行內(nèi)直接輸入下面命令看看?
echo '1+1' | bc
echo 'scale=2; 1/5' | bc (scale就是要保留小數(shù)點(diǎn)下幾位數(shù)的意思)
舉例來學(xué)習(xí),vi pi.sh
#!/bin/bash
echo -e "This program will calculate pi value. \n"
echo -e "You should input a float number to calculate pi value. \n"
read -p "The scale number (10-10000)?" checking
num=${checking:-"10"} #開始判斷是否有輸入數(shù)值
echo -e "Starting caculate pi value. Be patient."
time echo "scale=${num}; 4*a(1)" | bc -lq #4*a(1) 是bc主動(dòng)提供的一個(gè)計(jì)算pi的函數(shù),scale確定小數(shù)點(diǎn)位數(shù)
2.script的執(zhí)行方式差異
不同的script執(zhí)行方式會(huì)造成不一樣的結(jié)果
2.1 利用直接執(zhí)行的方式來執(zhí)行script
當(dāng)使用直接指令下達(dá)或利用bash來下達(dá)腳本時(shí),該script都會(huì)使用一個(gè)新的bash環(huán)境來執(zhí)行腳本內(nèi)的指令。也就是說,使用這種執(zhí)行方式時(shí),script其實(shí)是在子程序的bash內(nèi)執(zhí)行的。
當(dāng)子程序完成后,在子程序內(nèi)的各項(xiàng)變量或動(dòng)作將會(huì)結(jié)束而不會(huì)傳回到父程序中。
拿我們剛剛執(zhí)行的腳本showname.sh為例吧,我們在程序內(nèi)明明定義了兩個(gè)變量 ${firstname}和${lastname},可是當(dāng)我們在程序里嘗試echo ${firstname} ${lastname}卻沒有響應(yīng)。這也就說明了,當(dāng)showname.sh執(zhí)行完畢后,子程序bash內(nèi)的所有數(shù)據(jù)便被移除了。

2.2 利用source 來執(zhí)行腳本:在父程序中執(zhí)行
我們拿剛開始學(xué)習(xí)的showname.sh腳本來舉例吧
命令行中 source showname.sh之后,echo變量 ${firstname}和${lastname}
截鳥哥的圖:

echo 變量竟然生效了!
(這說明
${firstname}和${lastname}已經(jīng)不僅僅是存在于showname.sh的變量 )這也是為什么我們不注銷系統(tǒng),而要讓某些寫入~/.bashrc的設(shè)定生效時(shí),需要使用
source ~/.bashrc而不能使用 bash ~/.bashrc。