bash配置與shell腳本編程

寫在前面:

    博客書寫牢記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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章