【Linux學習筆記29】shell指令碼基礎

sdsnzy_9發表於2020-12-22

1. 什麼是shell


Shell 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一個典型的圖形介面 Shell


Shell 指令碼(shell script),是一種為 shell 編寫的指令碼程式


2. shell指令碼的意義


  1. 紀錄命令執行的過程和執行邏輯,以便以後重複執行
  2. 指令碼可以批量處理主機
  3. 指令碼可以定時處理主機

3. 建立shell指令碼


#!:是一個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種 Shell。

#!/bin/bash:幻數(此指令碼用/bin/bash來解釋執行)


自動新增指令碼首部vim ~/.vimrc

autocmd FileType yaml setlocal ai ts=2 sw=2 et
autocmd FileType sh set ai ts=4
autocmd BufNewFile *.sh,*.script call WESTOS()
"map <F4> ms:call WESTOS()<cr>'s

func WESTOS()
		call append(0,"###########################")
		call append(1,"##	Author:	zy")
		call append(2,"##	Version:")
		call append(3,"##	Create_Time:	".strftime("%Y/%m/%d"))
		call append(4,"##	Mail:	zy@westos.org")
		call append(5,"##	Info:	")
		call append(6,"###########################")
		call append(7,"")
		call append(8,"#!/bin/bash")
endfunc

測試:新建一個檔案 test.sh,副檔名為 sh(sh代表shell),自動生成首部

在這裡插入圖片描述



4. 執行shell指令碼


執行方法1:

  1. 手動在環境中開啟指定直譯器
  2. sh 指令碼檔案:執行

在這裡插入圖片描述

執行方法2:

直接在當前環境中執行shell中的指令(不開啟新的shell)

source 指令碼檔案

. 指令碼檔案

在這裡插入圖片描述


執行方法3:


開啟指令碼中指定的shell並使用此shell環境執行指令碼中的指令

不需要在第一行指定直譯器資訊

  1. chmod +x 指令碼檔名:給予執行許可權

  2. /指令碼檔名. /指令碼檔名:執行

在這裡插入圖片描述
在這裡插入圖片描述



5. 除錯shell指令碼


sh 命令
-c string
命令從-c後的字串讀取
-i
實現指令碼互動
-n
進行shell指令碼的語法檢查
-x
實現shell指令碼逐條語句的跟蹤

sh -x 指令碼檔案:顯示指令碼執行過程

+	#執行指令
不帶+	#命令執行的輸出

在這裡插入圖片描述



6. 指令碼練習


練習一:
執行 ‘ip_show.sh 網路卡’ ,顯示當前IP


ifconfig $1 | awk '/inet\>/{print $2}'

在這裡插入圖片描述


練習二:
host_messages.sh

  1. 顯示當前主機名稱,ip登陸當前主機的用
  2. 格式:
    hostname: XXXX
    ipaddress: XXXX.XXXX.XXXX.XXXX
    username: root

echo "hostname:	$HOSTNAME"
echo "ipaddress:	$(ifconfig 網路卡 | awk '/inet\>/{print $2}')"
echo "username:	$USER"

在這裡插入圖片描述

練習三:
clear_log.sh
執行此指令碼後可以清空日誌


#檢測是否是root使用者執行此指令碼
[ "$USER" = "root" ] || {
	echo -e "\033[31m Error: Please run script with root ! \033[0m"
	exit 1
	}
#清空日誌
LOGS=`sed -n '/RULES/,$p' /etc/rsyslog.conf | awk '!/^#|^$/&&/var/{print $2}' | sed 's/-//g'`

for LOG in $LOGS
do
	> $LOG && echo -e "\033[32m $LOG is cleared ! \033[0m"
done

在這裡插入圖片描述

相關文章