標籤:變數 linux 解譯器 指令碼 bash設定檔
bash指令碼編程
一、bash指令碼編程
bash指令碼編程(可以理解為命令的堆砌)
程式:包含語句和運算式(有判斷和迴圈)
順序執行
選擇執行
迴圈執行
程式 = 指令 + 資料
瞭解:編程分為2種:面向過程編程:以指令為中心組織資料;物件導向編程:以資料為中心組織指令
故指令碼編程可以歸納為面向過程的編程。
程式的執行模型 :
1、編譯執行:原始碼—>預先處理—>編譯—>彙編—>連結(編譯器)
2、解釋執行:源碼—>(解譯器)通過解譯器執行
註:bash指令碼的解譯器bash
二、bash指令碼的書寫
shebang(定義指令碼指定解譯器),一般儲存為.sh,linux沒有嚴格的尾碼要求
#!/bin/bash
#!/bin/bashcat /etc/shells sleep 20 #執行的時候,建立一個新的子進程,睡眠等待,子進程佔用父進程進行等待
註:運行指令碼的時候,要書寫絕對路徑。或者直接書寫bash test.sh臨時給予許可權
bash -x test.sh 調試運行
[[email protected] tmp]# bash -x test.sh + cat /etc/shells #每個命令逐條顯示,如有錯誤會進行提示/bin/sh/bin/bash/sbin/nologin/bin/dash/bin/tcsh/bin/csh+ sleep 20 #這裡是等待了20秒之後才繼續執行下一條命令+ dasdtest.sh: line 4: dasd: command not found[[email protected] tmp]#
三、變數相關知識
變數的定義:命名的記憶體空間
變數名和變數值組成,不同的視角變數有不同的分類
1、資料類型(按內容分)
強型別:例如c語言,對類型進行嚴格區分
弱類型:bash指令碼編程等,bash把所有值都預設當作字元
資料類型的作用
(1)定義了資料存放區格式
(2)資料的表示範圍
(3)可以參與的運算類型不一樣
2、類型(按格式分)
數值型:http://blog.51cto.com/user_index.php?action=addblog_new&did=126489
精確數值型:整數
近似數值型:float(單精確度)double(雙精確度)課外作業(浮點數的儲存格式)
字元型:不區分是否為單個字元
布爾型:true,false-->0,1
幾個重要的邏輯運算子:
邏輯與運算: && a && b 全真才為真,有假為假
邏輯或運算: || a || b 全假才為假,有真為真
邏輯非運算: ! !a 取反的運算
四、bash變數類型
(1)本地變數:只對當前shell進程有效,對當前shell之外的shell無效(如父shell進程和子shell進程都無效)
[[email protected] tmp]# aa=3[[email protected] tmp]# echo $aa3[[email protected] tmp]# bash[[email protected] tmp]# echo $aa[[email protected] tmp]# aa=2[[email protected] tmp]# exitexit[[email protected] tmp]# echo $aa3[[email protected] tmp]#
(2)環境變數:對當前shell進程及其子shell進程有效
[[email protected] tmp]# export HELLO="hello1"[[email protected] tmp]# echo $HELLOhello1[[email protected] tmp]# bash[[email protected] tmp]# echo $HELLOhello1[[email protected] ~]# env | grep ‘HELLO‘HELLO=hello1[[email protected] ~]# unset HELLO #取消環境變數的設定(這裡只對子進程生效)[[email protected] ~]# env | grep ‘HELLO‘[[email protected] ~]# echo $HELLO[[email protected] ~]# exitexit[[email protected] ~]# echo $HELLOhello1[[email protected] ~]#
註:env(printenv) 顯示當前shell中的所用環境變數
[[email protected] tmp]# env #這裡只列出部分環境變數,env=printenvHOSTNAME=localhost.localdomainTERM=xtermSHELL=/bin/bashHISTSIZE=1000SSH_CLIENT=192.168.199.180 54823 22QTDIR=/usr/lib64/qt-3.3QTINC=/usr/lib64/qt-3.3/includeSSH_TTY=/dev/pts/1USER=root
(3)局部變數:僅對某一段代碼空間有效變數,通常用於指令碼函數
(4)位置變數:$1 $2,...
(5)特殊變數:$? $0 $# $$ $* [email protected]
五、變數的引用及命名
1、${變數名}==變數的引用
·強引用: ‘‘ echo ‘root shell is $SHELL‘ 原樣輸出,不能解釋$符號
·弱引用: “” echo “root shell is $SHELL” 輸出“root shell is /bin/bash”
2、變數的命名規則
1、不能用程式中的關鍵字:if elif fi then for ....
2、只能使用數字、字母或底線,且不能以數字開頭
3、盡量做到見名知意
六、bash的設定檔
1、profile類:為互動式登陸的shell進程提供配置。
·對所有使用者有效設定檔即全域有效: /etc/profile和/etc/profile.d/*.sh
·僅對目前使用者有效設定檔即使用者個人有效:~/bash_profile
註:profile類設定檔的功用:
(1)用以定義環境變數
(2)運行命令或指令碼
2、bashrc類:為非互動式登陸的shell進程提供配置。
·全域有效:/etc/bashrc
·個人使用者有效:~/.bashrc
註:bashrc類設定檔的功用:
(1)定義本地變數
(2)定義命令別名(alias)
如何使修改後的bash設定檔重新生效:(2種方法)
source設定檔 或者 .設定檔
設定檔生效的優先順序:
·互動式登陸:/etc/profile->/etc/profile.d/*.sh->~/bash_profile->~/.bashrc->/etc/bashrc
所以定義此檔案可以使其他檔案全都生效。
·非互動式登陸:~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
本文出自 “行成于思” 部落格,請務必保留此出處http://meaningful.blog.51cto.com/4543452/1631658
shell指令碼基礎入門