哈哈,貓毛終于學(xué)習(xí)到 shell script 的撰寫了。在學(xué)完基礎(chǔ)的shell之后,深刻覺得認識一些撰寫shell常用的命令以及熟悉和靈活運用變量是非常有必要的贺喝。除此之外,還要參考大師們的script宗兼,多模仿和練習(xí)(有點類似編程了哈~)躏鱼。學(xué)習(xí)過程中我把腳本信息都曬在文章里面了,希望我們共同進步~~
除了剛開始Linux -- 認識shell script中認識的
echo
外殷绍,這篇文章里又新學(xué)習(xí)了幾個有用的命令挠他。
read
讀入標(biāo)準(zhǔn)輸入date
獲得時間信息(date +%Y%m%d
獲取年月日)bc
linux系統(tǒng)中的計算器
1.撰寫簡單的shell
1.1 對談式腳本:變量內(nèi)容由用戶決定
對談式,通過與用戶“互動”完成操作篡帕。
這里是通過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進行文件的建立
舉例來學(xué)習(xí)
#!/bin/bash
#1.讓使用者輸入文件名,并取得fileuser這個變量:
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ù)值運算:簡單的加減乘除
這里介紹兩種計算方法:
- (1)declare -i
使用declare
來定義變量的類型,當(dāng) 變量 定義成為 整數(shù) 后才能進行加減運算结执。
eg:declare -i total=${firstnu}*${secnu}
- (2)$((計算式))
利用$((計算式))
來進行數(shù)值運算度陆。
eg:total=$((${firstnu}*${secnu}))
這里舉例來學(xué)習(xí):vi multiplying.sh
,試著寫完腳本運行一下~
#!/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ù)值運算:透過bc計算pi
bc
命令是任意精度計算器語言献幔,通常在linux下當(dāng)計算器用懂傀,可以做基本的數(shù)學(xué)運算
在命令行內(nèi)直接輸入下面命令看看?
echo '1+1' | bc
echo 'scale=2; 1/5' | bc
(scale就是要保留小數(shù)點下幾位數(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主動提供的一個計算pi的函數(shù),scale確定小數(shù)點位數(shù)
2.script的執(zhí)行方式差異
不同的script執(zhí)行方式會造成不一樣的結(jié)果
2.1 利用直接執(zhí)行的方式來執(zhí)行script
當(dāng)使用直接指令下達或利用bash來下達腳本時蹬蚁,該script都會使用一個新的bash環(huán)境來執(zhí)行腳本內(nèi)的指令。也就是說郑兴,使用這種執(zhí)行方式時犀斋,script其實是在子程序的bash內(nèi)執(zhí)行的。
當(dāng)子程序完成后情连,在子程序內(nèi)的各項變量或動作將會結(jié)束而不會傳回到父程序中叽粹。
拿我們剛剛執(zhí)行的腳本showname.sh為例吧,我們在程序內(nèi)明明定義了兩個變量 ${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è)定生效時,需要使用
source ~/.bashrc
而不能使用 bash ~/.bashrc
州刽。