Linux學習筆記之Shell編程入門

Shell編程入門

8.1 Shell的編程過程

  • 內核是Linux系統的心臟,從開機自檢就駐留在計算機的內存中,直到計算機關閉爲止;而用戶的應用程序存儲在計算機的硬盤上,僅當須要時才被調入內存; 而Shell獨立於內核,是鏈接內核和應用程序的橋樑,並由輸入設備讀取命令,再將其轉爲計算機能夠理解的機械碼,Linux內核才能執行該命令
    (能夠理解爲 Shell是一種應用程序,當用戶登陸 Linux系統時,Shell就會被調入內存去執行;Shell提供了用戶與內核進行交互操做的一種接口,接收用戶輸入的命令,並把它送入內核去執行)shell

  • Shell不但能夠與用戶進行逐個命令交互執行,還能夠經過腳本語言進行編程;經過對Shell進行編程,可以使大量任務自動化,對系統管理、系統維護方面特別有用編程

  • Shell腳本的基本結構bash

    • Shell腳本一般都是以 .sh爲後綴
    • 第一行要以 「#! /bin/bash」 開頭,它表明的意思時,該文件使用的是bash語法
    • #表示註釋,在前面講過的,後面跟一些該腳本的相關注釋內容以及做者和建立日期或者版本等
  • Shell腳本的運行函數

    • 賦予權限,直接運行
      # chmod +x first.sh
      # ./first.sh
    • 使用Shell程序執行
      # bash first.sh
    • Shell的調試執行
      # bash -x first.sh

8.2 Shell的語法介紹

  • 使用變量:在Shell程序中全部變量保存的值都是字符串學習

    變量類型 說明
    環境變量 與Shell的執行環境相關的一些變量,如PATH、HOME等,用戶可從新定義。(1)環境變量的建立:export,export ABCD=2;(2)環境變量的查看:使用echo命令查看單個環境變量,如echo $PATH;使用printenv查看全部環境變量;使用set查看全部本地定義的環境變量
    預約義變量 用戶不能修改,只能引用的變量。由「$」+其餘符號組成
    位置變量 在執行腳本時,傳入到腳本中對應腳本位置的變量
    標準變量 也是環境變量,在bash環境創建時生成,可以使用printenv命令查看
    自定義變量 變量名=變量值(變量名前不需加$,等號兩邊不能有空格)
  • 經常使用的預約義變量設計

    預約義變量 說明
    $# 傳遞到腳本或函數的參數數量
    $* 傳遞到腳本或函數的所有參數
    $? 前一個命令執行狀況,返回0表示成功,其餘值表示失敗
    $$ 當前進程的ID(PID)
    $! 後臺運行的最後一個進程的進程ID(PID)
    $0 當前腳本的名稱
  • 輸入/輸出內部命令
    輸出命令:echo
    輸入命令:read調試


8.3 調試Shell程序

  • 常見的通常錯誤
    輸入錯誤:如輸入了錯誤的關鍵字、成對的符號漏輸入一部分等
    字符大小寫錯誤:在Linux中,嚴格區分字符大小寫。全部關鍵字都用小寫字母表示,建議變量名使用大寫字母組合來表示
    循環錯誤:因爲Shell中的循環控制語句與通常高級程序設計語言不一樣,輸入結構時容易出錯code

  • 調試跟蹤
    -n選項:不執行腳本,僅檢查腳本中的語法問題
    -v選項:將執行過程當中的每一個腳本命令(包括輸入的內容)都原樣輸出到終端
    -x選項:在執行過的每一個命令的行首添加「+」號顯示在終端,並顯示變量的值。使用該選項更方便跟蹤程序的執行過程接口


8.4 Shell程序設計實例

  • 增長用戶帳戶(編寫一個Shell程序addacount.sh,在系統中增長四個帳戶,同時設定他們的初始密碼爲123456,主組羣爲wl20)
#! /bin/sh
groupadd wl20
for username in xlr cyx zh gjj
do 
	useradd -g wl20 $username
	echo "123456" | passwd --stdin $username
done
  • 統計子目錄和文件數量(編寫一個Shell程序count.sh,統計當前或指定目錄中子目錄以及文件的數量)
#! /bin/sh
#腳本名稱 count.sh

read -p "請輸入路徑(直接回車換行表示當前目錄):" fpath
if ["$fpath" = ""]
then
	fpath=$(pwd)
fi
#定義一個函數fun_directory

directory(){
    echo "您輸入的路徑爲:$fpath"
    let "filenum=0"
    let "dirnum=0"

for dir in ${fpath}/*
do
	if [ -d "$dir" ]
	then
		let "dirnum+=1"
	elif [ -f "$dir" ]
		then
			let "filenum+=1"
	fi
done

echo "該目錄下共有子目錄$dirnum個"
echo "該目錄下共有文件$filenum個"
}
#調用函數
directory
  • 編寫Shell程序 cfkj.sh,打印出九九乘法表
#! /bin/bash
for((ROW=1;ROW<10;ROW++))
do
	for((COL=1;COL<=$ROW;COL++))
		do
			echo -ne "$ROW*$COL="`expr $ROW \* $COL` " "
		done
	echo
done

本套 Linux學習筆記完結,將來將在各章節中加入相關的思惟導圖以便理解,歡迎關注後續 ~進程

相關文章
相關標籤/搜索