一、SHELL編程的格式
首行shebang機(jī)制,指定解釋器,這里我們主要使用第一個(gè)
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
二、 SHELL的運(yùn)行的三種方法
1. 作為可執(zhí)行程序執(zhí)行
- 新的腳本都沒有可執(zhí)行權(quán)限,所以要先給執(zhí)行權(quán)限。
[root@centos7 test]# chmod a+x aubin.sh
- 先切換到當(dāng)前路徑,或者直接使用絕對路徑執(zhí)行。
[root@centos7 test]# ./aubin.sh
helo world
[root@centos7 test]# /app/test/aubin.sh
helo world
在當(dāng)前路徑執(zhí)行的話一定要寫./aubin.sh 。如果直接寫aubin.sh系統(tǒng)會在PATH路徑中搜索aubin.sh。當(dāng)然是根本找不到的,系統(tǒng)會報(bào)出錯(cuò)誤。你也可以將當(dāng)前路徑加入到PATH中,但是這種做法通常會引起其他錯(cuò)誤,所以不推薦將當(dāng)前路徑寫到PATH中。
2. 指定解釋器執(zhí)行
直接通過bash解釋器去調(diào)用腳本,因?yàn)閎ash擁有執(zhí)行權(quán)限,所以他去調(diào)用腳本時(shí)不關(guān)心腳本本身有沒有執(zhí)行權(quán)限。
[root@centos7 test]# bash aubin.sh #如果bash在PATH中,直接執(zhí)行即可
helo world
[root@centos7 test]# /bin/bash aubin.sh #否則就需要指定bash指定路徑
helo world
3. source執(zhí)行---不推薦
soruce 就是 點(diǎn)。常用于重新執(zhí)行剛修改的初始化文件。如/etc/profile , bash_profile, bashrc通過 source命令 在不重啟的情況下生效。
[root@centos7 test]# source aubin.sh
4. 三者區(qū)別
直接執(zhí)行需要權(quán)限。bash與source不需要權(quán)限。
直接執(zhí)行與bash會在子進(jìn)程執(zhí)行腳本,source會在當(dāng)前進(jìn)程執(zhí)行。會影響當(dāng)前操作環(huán)境
三、 檢查代碼中的語法錯(cuò)誤
#檢測腳本中的語法錯(cuò)誤
bash -n /path/to/some_script
#調(diào)試執(zhí)行
bash -x /path/to/some_script
四、 變量的類型
- 本地變量
僅對當(dāng)前shell有效,其他進(jìn)程包括子進(jìn)程均無效 - 環(huán)境變量
僅對當(dāng)前shell與子進(jìn)程有效??梢岳^承,無法回傳(子進(jìn)程-->父進(jìn)程)。
若父進(jìn)程注銷變量后,子進(jìn)程無法繼承。 - 局部變量
僅對當(dāng)前shell中局部代碼段有效 - 位置變量
$1 $2...... 用于調(diào)用腳本時(shí)傳入的參數(shù)
1. 本地變量
- 可以是直接字串; name=“root"
- 變量引用:name="$USER"
- 命令引用:name=`COMMAND` name=$(COMMAND)
- 刪除變量:unset name
- " ":弱引用,其中的變量引用會被替換為變量值。
- ' ':強(qiáng)引用,其中的變量引用不會被替換為變量值,而保持原字符串。
2. 環(huán)境變量
- 環(huán)境變量的定義
export name=VALUE
declare -x name=VALUE
- 查看所有環(huán)境變量
[root@centos7 test]env
[root@centos7 test]printenv
[root@centos7 test]export #↓等價(jià)
[root@centos7 test]declare -x #↑等價(jià)
3. 只讀變量與位置變量
- 只讀變量的聲明與查看
readonly name #聲明只讀變量
declare -r nam #聲明只讀變量
readonly –p #查看只讀變量
- 位置變量
$1, $2, ...:對應(yīng)第1、第2等參數(shù),shift [n]換位置
$0: 命令本身
$*: 傳遞給腳本的所有參數(shù),全部參數(shù)合為一個(gè)字符串
$@: 傳遞給腳本的所有參數(shù),每個(gè)參數(shù)為獨(dú)立字符串
$#: 傳遞給腳本的參數(shù)的個(gè)數(shù)
$@ $* 只在被雙引號包起來的時(shí)候才會有差異
set -- 清空所有位置變量
五、 退出狀態(tài)
進(jìn)程使用退出狀態(tài)來報(bào)告成功或失敗
- 0 代表成功,1-255代表失敗
- $? 變量保存最近的命令退出狀態(tài)
例子:不查看過程,只查看結(jié)果。
ping -c1 -W1 hostdown &> /dev/null
echo $?