(2) Shell 變數
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} |
|
$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: 1
第2 個引數 $2: 2
第10個引數 $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\]$
相關文章
- 2.Shell變數變數
- Shell程式設計-shell變數2-位置變數和預定義變數程式設計變數
- Shell 變數變數
- Shell變數變數
- shell中變數$#,$@,$0,$1,$2的含義變數
- Shell--變數變數
- shell Bash變數變數
- Shell入門——shell特性、變數變數
- Shell階段02 shell變數運算(整數運算/小數運算), shell變數案例變數
- R1-007 Shell變數簡介2變數
- Shell程式設計-shell變數1程式設計變數
- shell基礎篇(二)-shell變數變數
- [Shell] shell中的內部變數變數
- Shell 變數學習變數
- Linux Shell變數Linux變數
- [shell基礎]——變數變數
- awk引用shell變數變數
- awk使用shell變數變數
- Shell程式設計-02-Shell變數程式設計變數
- Shell學習【變數使用】變數
- CentOS shell中的變數CentOS變數
- Shell配置環境變數變數
- Linux之shell變數Linux變數
- 常用的shell變數用法變數
- SHELL的系統變數變數
- linux基礎——shell變數(本地變數和環境變數)Linux變數
- Shell-變數高階用法變數
- Shell 入門系列 (一): 變數變數
- shell程式設計–bash變數程式設計變數
- shell 變數賦值問題變數賦值
- shell變數命名與賦值變數賦值
- shell程式設計(一)變數程式設計變數
- shell 擷取變數的字串變數字串
- Shell程式設計-04-Shell中變數數值計算程式設計變數
- shell study-3day--shell變數及例項3D變數
- Shell-變數高階用法 (3) 有型別變數變數型別
- 簡述SHELL全域性環境變數與局變環境變數變數
- Shell變數的作用域問題變數