寫在前面:
博客書寫牢記5W1H法則:What,Why,When,Where,Who,How。
本篇主要內容:
● bash特徵之多命令執行
● 邏輯運算(與或非)
● 編程語言簡介
● shell腳本格式與特點
● bash配置,定製bash工作特徵
● 擴展
intall
mktemp
本篇涉及配置文件:
◎ /etc/profile
◎ /etc/profile.d/*.sh
◎ /etc/bashrc
◎ ~/.bash_profile
◎ ~/.bashrc
◎ ~/.bash_logout
bash特徵之多命令執行:
bash支持多命令執行,不但能夠按順序執行,還可以根據命令退出碼進行邏輯運算,來有選擇的執行。linux命令退出碼:0表示執行成功;1-255表示執行失敗。
順序執行多命令:
COMMAND1 `COMMAND2`
#命令引用方式執行多條命令
COMMAND1 | COMMAND2 | COMMAND3 | ...
#使用管道執行多命令
COMMAND1;COMMAND2;COMMAND3;...
#使用“;”逐條順序執行多條命令。前面命令錯誤與否不影響後面命令執行
邏輯組合(與或非):
COMMAND1 && COMMAND2 && ...
COMMAND1 || COMMAND2 || ...
! COMMAND1
邏輯運算:
與:
符號:&&
命令列表都爲true(即都正確執行),則返回true;否則返回false;
短路執行:其中一個爲false,則後面不再繼續執行,結果爲false;
或:
符號:||
命令列表都爲false(即執行錯誤),則返回false;否則返回true;
短路執行:其中一個爲true,則後面不再繼續執行,結果爲true;
非:
符號:!
! true = false
! false = true
與數學運算中的加減乘除類似,邏輯運算也有優先級:! > && > ||
shell腳本編程:
編程語言簡介:
(1)編程語言根據運行過程分類:
編譯運行類:
源代碼 --> 編譯器(編譯)--> 彙編器(彙編)--> 鏈接器(鏈接)-->可執行文件
解釋運行類:
源代碼 -->解釋器(解釋)--> 運行
(2)編程語言根據編程過程中功能的實現方式分類:
shell腳本編輯:
命令解釋器:基於shell進程去運行內部或外部命令程序;
編程接口:提供對過程式編程邏輯的支持,實現編程機制;
完整編程語言:
利用庫或編程組件進行編程;
(3)根據編程範式分類:
過程式編程語言
以指令爲中心,圍繞指令設計數據;
對象式編程語言(OOP)
以數據爲中心,圍繞數據組織指令;
過程式編程語言代碼執行順序有三種:
順序執行
選擇執行
循環執行
根據上面簡介,shell腳本是解釋運行、過程式編程語言,其運行以來與外部命令程序。
shell腳本格式:
1、腳本文本第一行。
頂格給出shebang:解釋器程序文件的路徑,用來致命解釋運行當前腳本代碼的解釋器。如:
#!/bin/bash
#!/bin/tcsh
#!/usr/bin/python3
#!/usr/bin/perl
2、#開頭的行爲註釋部分,會被編譯器忽略;
3、空白行會被編譯器忽略;
shell腳本編輯器:
普通的文本編輯器即可完成對shell腳本的編寫。如vi,vim,nano等。
shell腳本特點:
a.可以進行命令羅列編寫簡單腳本
b.許多命令不具有冪等性,需要用程序邏輯來判斷運行條件是否滿足。
冪等性:即多次執行的影響與一次執行的影響相同。
shell腳本運行方法:
linux文件權限管理策略決定,要想將文件加載爲進程,發起人必須有對此文件的x權限,所以,shell腳本運行前必須賦予x權限或指定編譯器:
a.賦予執行權限,直接運行:
chmod +x SCRIPT_FILE
./SCRIPT_FILE
b.直接運行編譯器,將腳本文件作爲參數:
bash SCRIPT_FILE
練習:
編寫shell腳本實現以下功能:
用戶storm不存在時,添加此用戶,添加完成後,提示添加完成;否則顯示該用戶已經存在。
答案:
[root@localhost shell]# cat useradd_storm.sh #!/bin/bash # if user storm excise,show "user storm excise".alse,add user storm,show "added user storm " # by Fred USERNAME=storm id $USERNAME &> /dev/null && echo "user $USERNAME excise" || (useradd $USERNAME && echo "added user $USERNAME") [root@localhost shell]# ./useradd_storm.sh added user storm [root@localhost shell]# ./useradd_storm.sh user storm excise
bash配置,定製bash工作特徵:
配置文件分類:
(1)profile類:
爲交互式登錄shell進程實現初始化配置文件;
定義環境變量;
運行命令或腳本;
(2)bashrc類:
爲交互式登錄shell進程實現啓動配置的配置文件;
定義命令別名;
定義umask;
(3)logout類:
爲交互式登錄shell進程提供終止清理功能的配置文件;
根據配置文件的作用範圍分類:
(1)對全局所有用戶生效:(管理員有權限修改)
/etc/profile,/etc/profile.d/*.sh
/etc/bashrc
(2)僅對單個用戶有效:
~/.bash_profile
~/.bashrc
shell進程的啓動方式分類:
用戶登錄式:
通過終端登錄用戶啓動的shell進程;
使用su - USERNAME實現的用戶切換;
非登錄式:
su USERNAME實現的用戶切換;
圖形界面打開的命令行接口;
運行腳本;
不同shell進程啓動方式,配置文件的讀取數量、順序不盡相同:
用戶登錄式:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非登錄式:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
修改配置文件後,新定義配置生效方式:
(1)重新登錄shell進程:
登出再重新登錄;
exec /bin/bash;
(2)使用source命令重新加載指定配置文件:
source /etc/profile
注意:使用source命令會有副作用。例如:
#在~/.bash_profile中定義PATH環境變量,文件尾部添加以下行: PATH=$PATH:$HOME/bin export PATH #執行source並查看PATH環境變量: [root@localhost ~]# echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@localhost ~]# source .bash_profile [root@localhost ~]# source .bash_profile [root@localhost ~]# source .bash_profile [root@localhost ~]# echo $PATH /root/shell:/root/shell:/root/shell:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/root/bin:/root/bin
可以看到/root/shell出現了多次,所以應儘量使用exec命令。
擴展:
install
copy files and set attributes
install [OPTION]... [-T] SOURCE DEST
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...
-o, --owner=OWNER:指定屬主
-g, --group=GROUP:指定屬組
-m, --mode=MODE:指定權限,3位八進制表示
與cp命令區別在intall能在複製的同時指定屬主屬組權限信息。
實例:
[root@localhost ~]# ls -l /etc/fstab -rw-r--r--. 1 root root 595 Mar 4 02:40 /etc/fstab [root@localhost ~]# install -o fred -g fred -m 664 /etc/fstab . [root@localhost ~]# ls -l fstab -rw-rw-r--. 1 fred fred 595 Mar 8 11:25 fsta
mktemp
create a temporary file or directory
mktemp [OPTION]... [TEMPLATE]
-d, --directory:創建目錄而非文件
-p DIR, --tmpdir[=DIR]:指定臨時文件目錄,默認爲當前目錄
此命令會使用隨機字符作爲文件名的一部分,來實現創建臨時文件,以保證創建的臨時使用文件不與其他文件重名導致數據丟失。使用3個及以上的“X”表示隨機字符。
實例:
[root@localhost ~]# mkdir tempdir [root@localhost ~]# mktemp -p tempdir testfile.XXX.txt tempdir/testfile.5NK.txt [root@localhost ~]# ls tempdir/ testfile.5NK.txt