乾貨篇:Python基礎教程之shell編程資料大全
一.shell的作用和歷史
二.shell的常用功能
三.shell變數種類
四.shell腳本的運行
五.編寫簡單的shell腳本
一.Shell的作用及常見種類
Shell的作用 -- 命令解釋器,「翻譯官」
vim /etc/shells
二.Bash的常用功能
1. Tab鍵自動補齊
2.Bash的命令歷史
命令歷史
保存用戶曾經執行過的命令操作
存放位置:~/.bash_history 文件
查看歷史命令
使用↑、↓按鍵逐條翻看,允許編輯並重複執行
執行:history
清除歷史命令
執行:history -c
3.調用歷史命令
!n:執行歷史記錄中的第n條命令
!str:執行歷史記錄中以「str」開頭的命令
設置記錄歷史命令的條數
修改 HISTSIZE 參數(默認為1000條)
4.命令別名
為使用頻率較高的複雜命令行設置簡短的調用名稱
存放位置:~/.bashrc
查看命令別名
格式:alias [別名]
設置命令別名
執行:alias 別名=實際執行的命令
取消已設置的命令別名
格式:unalias 別名
5.Bash的標準輸入輸出
互動式硬體設備
標準輸入:從該設備接收用戶輸入的數據
標準輸出:通過該設備向用戶輸出數據
標準錯誤:通過該設備報告執行出錯信息
6.Bash的重定向操作
改變標準輸入、標準輸出、標準錯誤的方向
7.Bash的管道操作
管道操作符號「|」
連接左右兩個命令,將左側的命令輸出的結果,作為右側命令的輸入(處理對象)
格式:cmd1 | cmd2 [... | cmdn]
三.Shell變數的應用
1.Shell變數含義
為靈活管理Linux系統提供特定參數,有兩層意思:
1)變數名:使用固定的名稱,由系統預設或用戶定義
2)變數值:能夠根據用戶設置、系統環境變化而變化
2.Shell變數的種類
用戶自定義變數:由用戶自己定義、修改和使用
環境變數:由系統維護,用於設置用戶的Shell工作環境,只有極少數的變數用戶可以修改
預定義變數:Bash預定義的特殊變數,不能直接修改
位置變數:通過命令行給程序傳遞執行參數
3.變數的賦值與引用
定義新的變數
變數名要以英文字母或下劃線開頭,區分大小寫
格式:變數名=變數值
查看變數的值
格式:echo $變數名
查看所有變數:set
清除變數
unset 變數名
[root@localhost ~]# DAY=Sunday
[root@localhost ~]# echo $DAY
Sunday
在查看變數時,如果變數名容易和後邊的字元串連在一起導致混淆,則應該使用大括弧將變數名括起來,使用形式為:${變數名} ,例如:
若已知變數Var的值為lamp,則執行「echo $Var3.0」命令後將顯示結果「.0」而不是「lamp3.0」,因為在該命令中,會將「Var3」當成變數名(默認未定義此變數)。若希望正確顯示「lamp3.0」的輸出結果,則需要執行「echo ${Var}3.0」
從鍵盤輸入內容為變數賦值
格式: read [-p "信息"] 變數名
結合不同的引號為變數賦值
雙引號 「 」 :允許通過$符號引用其他變數值
單引號 『 』 :禁止引用其他變數值,$視為普通字元
反撇號 ` ` :將命令執行的結果輸出給變數
4.數值變數的運算
計算整數表達式的運算結果
格式:expr 變數1 運算符 變數2 ...[運算符 變數n]
expr的常用運算符
加法運算:+
減法運算: -
乘法運算: *
除法運算: /
求模(取余)運算: %
Bash程序並不適合進行強大的數學運算,例如小數或指數運算的,一般只能進行簡單的整數運算
對Shell變數進行數值運算時,更多的時候是用於腳本程序的過程式控制制,如控制程序的循環次數
在expr命令的使用格式中,變數與運算符間是有空格的,可以同時使用多個運算符、多個變數
由於星號「*」作為Bash環境中的通配符使用,因此乘法運算符需要使用「*」的特殊形式(轉義字元)
#!/bin/bash
read -p "please input num1:" -t 30 test1
read -p "input num2:" -t 30 test2
declare -i sum=」$test1+$test2」
echo 「num1 + num2 = $sum」
5.環境變數賦值
設置變數的作用範圍
格式:export 變數名...
export 變數名=變數值 [...變數名n=變數值n]
查看環境變數
env 或 export
清除用戶定義的變數
格式:unset 變數名
對於用戶自行定義的變數,默認只能在當前的Shell環境中使用,因此稱為局部變數
局部變數在新開啟的子Shell環境中是無效的(無法引用定義的變數) ,因此需要使用export命令將變數輸出為全局變數
只有對於全局變數,在當前Shell的子Shell環境(例如zsh)中,才能夠被正確引用
變數不存在或者值為空時,通過echo命令查看時將顯示一個空行
6.系統環境變數
環境變數配置文件
全局配置文件:/etc/profile
/etc/bashrc
用戶配置文件:~/.bash_profile
~/.bashrc
有完整登陸流程時,載入環境變數順序
先讀/etc/profile
再讀~/.bash_profile
再讀~/.bashrc
再讀/etc/bashrc
開始Bash界面
用set查看環境變數
[root@localhost root]# set
SHELL=/bin/bash
TERM=xterm
UID=0
USER=root
consoletype=pty
環境變數
常見的環境變數:
$USER 、$LOGNAME
$UID 、 $SHELL 、$HOME
$PWD、 $PATH
$PS1、$PS2
查看環境變數
[root@localhost ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# PATH="/opt/bin:$PATH"
[root@localhost ~]# echo $PATH
/opt/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
命令執行時查找順序
1、以相對/絕對路徑執行
2、由alias找到的執行
3、bash內部命令執行
4、按$PATH路徑執行
環境變數PS1
echo $PS1
d 日期 時間(24) T時間(12)
H 完整主機名 h 簡寫主機名
u 用戶名 v bash版本
w 完整目錄 W 最後一個目錄
# 執行了第幾個命令 $ 提示符
PS1=『[u@h W ##]$』
位置變數
表示為 $n,n為1~9之間的數字
$0為第0個參數,腳本本身
[root@localhost ~]# ./exam01.sh one two three four five six
預定義變數
表示形式如下
$#:命令行中位置參數的個數
$*:所有位置參數的內容
$?:上一條命令執行後返回的狀態,當返回狀態值為0時表示執行正常,非0值表示執行異常或出錯
$$:當前所在進程的進程號
$!:後台運行的最後一個進程號
$0:當前執行的進程/程序名
[root@localhost ~]# bash
[root@localhost ~]# echo $0 $$
bash 5887
[root@localhost ~]# exxit
bash: exxit: command not found
[root@localhost ~]# echo $?
127
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $?
0
輸出位置參數變數,腳本後要接參數
#!/bin/bash
echo "the command is $0"
echo "canshu1 is $1"
echo "canshu2 is $2"
輸出預定義變數
#!/bin/bash
echo "canshu zongshu $#"
echo "canshu libiao: $*"
echo $?
多命令運行
; 命令順序執行。
&& 前後命令的執行存在邏輯與關係,只有&&前面的命令執行成功後,它後面的命令才被執行。
|| 前後命令的執行存在邏輯或關係,只有||前面的命令執行失敗後,它後面的命令才被執行。
通配符與特殊符號
通配符
* 任意多個
? 任意一個
[] 括弧內任一個 [^0-9]非數字
特殊符號
轉義符
& 後台
! 非
四.Shell腳本的概念
Shell腳本
1.用途:完成特定的、較複雜的系統管理任務
2.格式:集中保存多條Linux命令,普通文本文件
3.執行方式:按照預設的順序依次解釋執行
編寫可執行的Shell腳本
建立包含執行語句的腳本文件
#腳本文件中包括的內容
運行環境設置:#!/bin/bash
注釋信息:以#開始的說明性文字
可執行的Linux命令行
為腳本文件添加可執行許可權
在腳本文件的各組成部分中,只有可執行語句是必不可少的(否則就不叫程序了)
當預設運行環境設置時,會自動由當前載入該腳本的Shell解釋器負責解釋執行
Shell腳本文件的擴展名並無嚴格的約束,不一定非得是「.sh」結尾的
給shell腳本增加執行許可權
[root@localhost ~]# vi repboot.sh
#!/bin/bash
# To show usage of /boot directory and mode of kernel file.
echo "Useage of /boot: "
du -sh /boot
echo "The mode of kernel file:"
ls -lh /boot/vmlinuz-*
[root@localhost ~]# chmod a+x repboot.sh
運行Shell腳本程序
1.直接執行具有「x」許可權的腳本文件
例如:./repboot.sh
2.使用指定的解釋器程序執行腳本內容
例如:bash repboot.sh
3.通過source命令(或 . )讀取腳本內容執行
例如:souce repboot.sh 或 . hello.sh
腳本程序可以通過多種方式運行:
為腳本文件設置了可執行屬性後,在Shell命令行中可以直接通過腳本文件的路徑執行腳本程序
在調試階段可以使用Shell程序直接調用腳本文件,不要求腳本具有可執行許可權,格式是:bash 腳本名
使用Bash的內部命令「.」腳本文件執行時,將不會開啟新的Shell環境。使用這種方式時,腳本文件作為「.」命令的參數,因此同樣不要求具備可執行許可權。
五.Shell腳本應用示例
示例1:
每周五17:30清理FTP伺服器的公共共享目錄
檢查 /var/ftp/pub/ 目錄,將其中所有子目錄及文件的詳細列表、當時的時間信息追加保存到 /var/log/pubdir.log 日誌文件中,然後清空該目錄
[root@localhost ~]# vi /opt/ftpclean.sh
#!/bin/bash
date >> /var/log/pubdir.log
ls -lhR /var/ftp/pub >> /var/log/pubdir.log
rm -rf /var/ftp/pub/*
[root@localhost ~]# crontab -e
30 17 * * 5 /opt/ftpclean.sh
Shell腳本應用示例
示例2:
每隔3天對資料庫目錄做一次完整備份
統計 /usr/local/mysql/var 目錄佔用的空間大小、查看當前的日期,並記錄到臨時文件 /tmp/dbinfo.txt 中
將 /tmp/dbinfo.txt 文件、/usr/local/mysql/var 目錄進行壓縮歸檔,備份到/opt/dbbak/目錄中
備份後的包文件名中要包含當天的日期信息
最後刪除臨時文件/tmp/dbinfo.txt
[root@localhost ~]# vi /opt/dbbak.sh
#!/bin/bash
DAY=`date +%Y%m%d`
SIZE=`du -sh /usr/local/mysql/var`
echo "Date: $DAY" >> /tmp/dbinfo.txt
echo "Data Size: $SIZE" >> /tmp/dbinfo.txt
mkdir /opt/dbbak
cd /opt/dbbak
tar -zcPf mysqlbak-${DAY}.tar.gz /usr/local/mysql/var /tmp/dbinfo.txt
rm -f /tmp/dbinfo.txt
[root@localhost ~]# crontab -e
55 23 */3 * * /opt/dbbak.sh
更多Python學習資料,歡迎點擊進群向群主索要。 ←戳我
推薦閱讀:
※AppleScript類自然語言與非英語語法設計
※字元指針數組的使用--替換人名-題目分析
※測試的道理
※C++之函數/結構體/類 模板
※讓我們做個簡單的解釋器(一)