Linux 之 shell script -- 撰寫基礎(chǔ)的shell

哈哈,貓毛終于學(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獲取年月日)
  • bc linux系統(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ù)便被移除了。

showname.sh在子程序中運(yùn)作的示意圖

2.2 利用source 來執(zhí)行腳本:在父程序中執(zhí)行

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

source showname.sh

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,732評(píng)論 0 5
  • 一,shell題記 不懂shell的程序員不是好程序員,學(xué)習(xí)shell是為了自動(dòng)化,使用自動(dòng)化可以非常有效的提高工...
    架構(gòu)師小秘圈閱讀 8,799評(píng)論 3 70
  • 本文是對(duì)Linux shell編程的一個(gè)學(xué)習(xí)比較,共包括如下章節(jié)的內(nèi)容: 概述 基本語法 結(jié)構(gòu)化語句 函數(shù) 小結(jié) ...
    我是老薛閱讀 907評(píng)論 0 5
  • 第 2 章 SHELL 基礎(chǔ)知識(shí)2.1 shell腳本我們在上面簡單介紹了一下什么是shell腳本,現(xiàn)在我們來進(jìn)一...
    LiWei_9e4b閱讀 1,652評(píng)論 0 0
  • 2019.4.10 關(guān)于一次群內(nèi)討論的思考 工作經(jīng)歷和工作環(huán)境會(huì)決定一個(gè)人的思考方式和思考角度。 比如,在討論“會(huì)...
    MM彤閱讀 1,950評(píng)論 0 0

友情鏈接更多精彩內(nèi)容