(2) Shell 變數

客串演出_mirror發表於2017-07-02

Shell 中可使用的變數大致分為四種: 環境變數, 預定義變數, 指令碼變數, 使用者自定義變數.

1. 基礎知識

1.1 變數分類

  • 環境變數: 主要儲存的是和系統操作環境相關的變數, 可以新增和修改
  • 預定義變數: 系統預設的一些變數
  • 指令碼變數: 呼叫指令碼時, 傳入的引數, 又稱位置引數變數
  • 使用者自定義變數: 指令碼中設定的變數

1.2 變數名命名

  • 變數名和=號直接不能有空格
  • 變數名不能以數字開頭, 首個字元只能為字母(A-Z, a-z)
  • 變數名直接不能有空格, 可以使用下劃線
  • 變數名不能使用標點符號
  • 環境變數名建議全部大寫

1.2 變數賦值

  • 變數值與=號直接不能有空格
  • 變數型別預設都是字串型別
  • 變數值可以使用特殊符號,轉義符號, 如: name=”zhang\nsan”
  • 變數值可以是命令執行的結果, 用反引號, 如:dt=date
  • 變數值可以是包含其他變數的表示式, 如:result=”hello,$name”

2. 環境變數

環境變數通常用於儲存一些與系統操作相關的命令, 比如如JAVA_HOME. 在指令碼中設定的環境變數, 只在當前指令碼中生效, 不會修改系統的環境變數. 通常用於為某些程式的執行準備環境. 比如說, 系統預設安裝的是jdk1.7, 而你的程式想要使用jdk 1.8執行 ,那麼就可以建立一個指令碼, 指令碼中先設定JAVA_HOme 的值, 然後再執行你的程式就好了.

1. 變數定義

  • 語法1: export NAME=value, 定義新的環境變數
  • 語法2: export NAME, 將已有使用者自定義變數轉換為環境變數

2. 變數引用

對環境變數的引用有兩種語法,語法1比較簡單常用, 語法2在特殊場景下使用.如:${NAME}script, 如果用用語法1, 那麼會找變數名為 NAMEscript 的值, 而不是NAME值了

  • 語法1: $NAME
  • 語法2: ${NAME}

3. 變數刪除:

  • 格式: unset NAME

4. 檢視所有環境變數:

  • 命令: env

5. 測試指令碼:

#!/bin/bash

#檢視系統環境變數
echo "JAV_HOME:$JAVA_HOME"

# 設定環境變數
export JAVA_HOME=/opt/app/jdk/jdk1.8.0_121
echo "JAVA_HOME:$JAVA_HOME"

# 刪除環境變數
unset JAVA_HOME
echo "JAVA_HOME:$JAVA_HOME"

* 輸出結果: *
指令碼中將環境變數JAVA_HOME 刪除了, 指令碼中便獲取不到JAVA_HOME 環境變數了, 但是指令碼執行完之後, 直接輸出環境變數JAVA_HOME, 會發現依然存在.

[admin@localhost shell]$ ./var03.sh
JAV_HOME:/opt/app/jdk/jdk1.6.0_31
JAVA_HOME:/opt/app/jdk/jdk1.8.0_121
JAVA_HOME:
[admin@localhost shell]$ echo $JAVA_HOME
/opt/app/jdk/jdk1.6.0_31
[admin@localhost shell]$

3. 預定義變數

預定義變數是系統內建的, 用於表示特殊含義的一些變數. 常用的預定義變數有:

變數名 變數含義
$? 記錄上次執行的命令的返回狀態, 返回0 表示執行成功, 否則表示執行錯誤
$$ 記錄當前指令碼執行時的程式id
$! 記錄上次後臺執行的程式的PID

* 測試指令碼 *

#!/bin/bash
# &> 表示將輸出結果重定向, $> /dev/null 表示不輸出指令碼執行結果

# 系統有此目錄, 執行結果成功
ls / &> /dev/null
echo "ls / 執行結果: $?"

# 系統無此目錄, 執行結果為失敗
ls /hhhh &> /dev/null
echo "ls /hhhh 執行結果: $?"

# 輸出當前指令碼程式id
echo "當前程式PID: $$"

# 輸出上次後臺執行程式id
ls / &> /dev/null &
echo "上次後臺執行程式id: $!"

* 輸出結果: *

[admin@localhost shell]$ ./var01.sh
ls / 執行結果: 0
ls /hhhh 執行結果: 2
當前程式PID: 22798
上次後臺執行程式id: 22853
[admin@localhost shell]$

4. 指令碼變數

1. 變數引用

變數名 變數含義
$# 代表傳入的引數格式
$* 代表傳入的所有引數, 把所有傳入的引數當做是一個字串變數
$@ 代表傳入的所有引數, 把所有傳入的引數當做一個陣列
n|n,1,,9,
n | n為數字,從1開始,表示傳入的第幾個引數,當超過9個引數時,需要用
{n}
$0 命令本身

2. 示例指令碼:

#!/bin/bash

echo '引數數量 $#:' $#
echo '引數列表 $*:' $*
echo '引數陣列 $@:' $@

echo '呼叫命令 $0:' $0
echo '第1 個引數 $1:' $1
echo '第2 個引數 $2:' $2
echo '第10個引數 $10:' ${10}

echo '============== 遍歷輸出: $* ========================'
# 只有一個元素
for i in "$*"
do
echo "arg:" $i
done

echo '============== 遍歷輸出: $@ ========================'
# 有多個元素
for y in "$@"
do
echo "arg:" $y
done

* 測試結果: *

[admin@localhost shell]$ ./var01.sh 1 2 3 4 5 6 7 8 9 10
引數數量 $#: 10
引數列表 $*: 1 2 3 4 5 6 7 8 9 10
引數陣列 $@: 1 2 3 4 5 6 7 8 9 10
呼叫命令 $0: ./var01.sh
第1 個引數 $1: 12 個引數 $2: 210個引數 $10: 10
============== 遍歷輸出: $* ========================
arg: 1 2 3 4 5 6 7 8 9 10
============== 遍歷輸出: $@ ========================
arg: 1
arg: 2
arg: 3
arg: 4
arg: 5
arg: 6
arg: 7
arg: 8
arg: 9
arg: 10
[admin@localhost shell]$

5. 使用者之定義變數

使用者自定義的變數,作用域為當前指令碼, 也就是說只能在指令碼內使用.

1. 變數定義:

  • 格式:[readonly] name=value
  • 格式:[readonly] name=命令
  • 注意: =號兩邊不能有空格
  • readonly 表示為只讀變數, 如果修改會報錯

2. 變數引用:

對環境變數的引用有兩種語法,語法1比較簡單常用, 語法2在特殊場景下使用如: ${name}script, 如果用用語法1, 那麼會找變數名為 namescript 的值, 而不是name 值了

  • 語法1: $name
  • 語法2: ${name}

3. 變數刪除:

  • 格式: unset name

4. 變數特殊處理

4.1 數字變數運算

  • 由於shell 中所有變數都是字串, 當需要對變數進行數字進行運算時, 使用普通的方式是不能行的, 需要用到$(( a + b))

4.2 字串拼接

shell 中字串的拼接符為 .

5. 測試指令碼:

#!/bin/bash

#定義變數
name="java"

#變數引用
echo "name:$name"
echo "book:${name}Script"

#刪除變數
unset name
echo "name:$name"

#數值運算
a=10
b=5
echo "$a+$b=$(( $a + $b ))"
echo "$a*$b=$(( $a * $b ))"
echo "$a/$b=$(( $a / $b ))"

#獲取當前伺服器時間
date=`date`
echo "date:$date"

#只讀變數
readonly sum=0
sum=1

* 測試輸出: *

\[admin@localhost shell\]$ ./var02.sh
name:java
book:javaScript
name:
10+5=15
10*5=50
10/5=2
date:Thu Jun 22 16:40:29 CST 2017
./var02.sh: line 27: sum: readonly variable
\[admin@localhost shell\]$

相關文章