一、Shell腳本的執行通常可以采用以下幾種方式:
1):bash script-name或sh script-name(推薦使用) 2):path/script-name 或./script-name(當前路徑下執行腳本) 3):source script-name或 . script-name #→注意”.”點號。 4):sh<script-name或cat scripts-name|sh(同樣適合bash)
二、普通變量:
1:環境變量:變量必須是大寫
1):配置永久性的環境變量,全局變量的配置文件:/etc/profile 、/etc/bashrc 基本上使用 /etc/profile 2):配置用戶的環境變量的配置文件,分別是:用戶的主目錄下的隱藏文件:~/.bash_profile 、 ~/.bash_bashrc 3):臨時設置 # export ZSY=1 4):設置所有用戶生效的目錄 :/etc/profile.d/ :目錄下必須是腳本否則無法使用 5):如果寫一個JAVA的腳本,要把JAVA環境變量放入腳本內,特別是定時任務執行的時候 6):顯示環境變量: (1):# env //* 顯示的環境變量 (2):# set //* 顯示的環境變量跟多 7):取消環境變量 (1):# unset <環境變量名> //* 臨時取消變量 (2):進入文件刪除變量
2:環境變量的意義:
1):UID :當前用戶的UID 2):USER :當前登錄的用戶 3):HOME :當前的用戶主目錄 4): _= :上一條命令的最后一個參數 5):BASH :調用實例時使用的全路徑 6):PS1 :當前的終端 7):PATH :命令所在路徑
3:局部變量:
1):一般連續的字符串,數字,路徑等可以不加任何引號,不過無引號的情況最好用雙引號替代之。 2):如果變量中使用其他變量時,則不可以使用單引號否則無法使用:如下: [root@centos6 ~]# a='$USER' [root@centos6 ~]# echo $a $USER 3):如果變量中有空格的話,就必須使用雙引號否則無法輸出:如下: [root@centos6 ~]# a=1 2 3 -bash: 2: command not found [root@centos6 ~]# a="1 2 3" [root@centos6 ~]# echo $a 1 2 3
4:引號的意義
1):無引號:把內容輸出出來,會將未含有空格的字符串視為一個整體輸出; 如果有命令(要在反引號中的)、變量、特殊轉義符解析出結果然后子在輸出最終內容來,如果字符串中有空格等特殊字符則則不能完整輸出,需要加雙引號,一般連續的字符串,數字,路徑等可以不加任何引號, 不過無引號的情況最好用雙引號替代之。 2):單引號:可以說是所見即所得:即將單引號內的所有內容都原樣輸出,或者描述為里面看到的是什么就會輸出什么 3):雙引號:把雙引號內的所有內容都輸出出來;如果有命令(要在反引號中的)、變量、特殊轉義符解析出結果然后子在輸出最終內容來。 4):反引號:一般用於執行命令,執行的時候命令會執行,同理可以使用 a=$(ls):結果相同
5:變量定義小結:
5.1. 普通變量:
a=1 # 連續的數字字符串 a="/etc/rc.local $USER" # 解析結果后輸出 a='$USER' # 原樣輸出
5.2. 命令內容定義:
a=`ls` #反引號, 將反引號中字符當做命令輸出 a=$(ls)
5.3. 特殊變量:位置變量
1):$n :獲取當前執行的shell腳本的第n個參數值(參數值默認以空格區分,如果參數加了雙引號,則將雙引號的整個作為一個參數, 不管其中是否有空格,如 例3 ),n=1..9 ,當 n 為0時表示腳本的文件名,如果n大於9,用大括號括起來${10},參數以空格隔開。如下:
例1: [root@centos6 ~]# echo $1 a a [root@centos6 ~]# echo $1 $2 a b a b 例2: [root@centos6 ~]# cat p.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} [root@centos6 ~]# sh p.sh {a..z} a b c d e f g h i j k l m n o 例3: [root@centos6 ~]# cat p.sh echo $2 [root@centos6 ~]# sh p.sh "1 2" "3 4" 3 4 # 注意當整數超過9 時,數字要使用 “{}” 擴起來否則會出現 以下結果 [root@centos6 ~]# cat p.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 [root@centos6 ~]# sh p.sh {a..z} a b c d e f g h i a0 a1 a2 a3 a4 a5
2):$0 獲取當前腳本本身的名字
$1 # 獲取當前傳遞給該shell腳本的第一個參數 $2 # 獲取當前傳遞給該shell腳本的第二個參數 $# # 獲取當前傳給腳本的參數個數 $$ # 獲取當前腳本運行的當前進程 PID 號 $@ # 獲取當前傳給腳本的所有參數的列表 $* # 獲取當前以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,參數可超過9個 $? # 是顯示最后命令的退出狀態,0表示沒有錯誤,其他表示有錯誤
3):$1 是傳遞給該shell腳本的第一個參數,一般系統啟動文件最后都有這個,作為接收輸入的命令如
# /etc/init.d/sshd start # 是將 start 賦值給 $1,然后腳本根據這個參數執行這個參數下的命令:如下腳本: [root@centos6 ~]# cat p.sh case "$1" in start) echo "123" && exit 0 ;; stop) echo "234" && exit 0 ;; esac exit [root@centos6 ~]# /etp.sh start 123 [root@centos6 ~]# sh p.sh stop 234
4):$0 是用來取腳本本身的名字,就是你命令之后跟的內個名字,如下圖的 sh a.sh 中的 a.sh
[root@centos6 ~]# cat a.sh echo $0 [root@centos6 ~]# sh a.sh a.sh 例1:在啟動腳本中也有 $0 ,當啟動腳本的時候輸入的不正確時就會出現 [root@centos6 ~]# tail -4 /etc/init.d/sshd |head -1 echo $"Usage: $0 {start|stop|restart|reload|force-reload|condrestart|try-restart|status}" [root@centos6 ~]# /etc/init.d/sshd * 用法: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status} 例2:將文件與名字分離 [root@centos6 etc]# cat ~/a.sh dirname $0 basename $0 [root@centos6 etc]# sh ~/a.sh /root a.sh # dirname $0 取得是路徑 # bashname $0 取得是名字
5):$# :獲取當前傳給腳本的所有參數的個數,一般用於控制參數個數,如例1.
[root@centos6 ~]# cat a.sh echo $# [root@centos6 ~]# sh a.sh 1 2 3 4 5 6 6 例1:判斷參數少於兩個,就告訴報 腳本名加 "ARG1 ARG2" ,等於或大於兩個參數時,顯示錢兩個參數 [root@centos6 ~]# cat a.sh #!/bin/bash [ $# -ne 2 ] && { echo "$0 ARG1 ARG2" exit 1 } echo $1 $2 [root@centos6 ~]# sh a.sh a.sh ARG1 ARG2 [root@centos6 ~]# sh a.sh 1 2 1 2 # 腳本中的 exit 1 指的是返回值:如下例2 例2: [root@centos6 ~]# cat p.sh echo "123456789" exit 28 [root@centos6 ~]# sh p.sh 123456789 [root@centos6 ~]# sh p.sh ;echo $? 123456789 28
6):$? 命令執行的返回值,0表示沒有錯誤,其他表示有錯誤
[root@centos6 ~]# ls ; echo $? a.sh iptables.sh p.sh 0 [root@centos6 ~]# 123 ; echo $? -bash: 123: command not found 127 # 分號就是間隔符,表示前面和后面是兩個命令的意思,執行完前一個,再執行后一個,兩個命令沒有任何依賴關系
5.4. 返回值代表意義:
0 :成功 1 或 2 :權限拒接,表示權限不足 1~125 :表示運行失敗,腳本命令、系統命令錯誤或參數傳遞錯誤; 126 :找到命令了,但是無法執行 127 :命令找不到, 大於128的 :命令執行中退出