2.8 補充:shell變量引用方式


一 變量
 
變量:本質上是程序中保存用戶數據的一塊內存空間,變量名就是內存空間地址。
 
Shell中:變量可由字母數字和下划線組成,以字母或下划線開頭。
 
命名:PATH=/sbin
 
     JAVA_HOME=”/usr/lib”
 
(變量名區分大小寫)
 
在shell中,變量的數據類型無需顯式聲明,變量的數據類型會根據不同操作有所變化。
 
(shell變量部分數據類型,統一按字符串存儲,但根據變量的上下文環境,允許程序執行一些不同操作)。為了能執行加減法計算,shell為自動進行數據類型的轉換,如果遇到含義非數字的字符串,則該字符串被轉換成整數0。同時,在空串以及沒有定義變量的情況下,變量值都會被轉換為整數0。
 
例如,n=“” echo “n=$n”
 
     echo “p=$p”
 
 
 
1.1變量的定義:
 
Shell中可以直接使用變量,無需定義,如果變量的值包含空格,一定要用引號引起來。
 
declare attribute variable(控制變量相關屬性)
 
attribute 表示變量屬性,variable表示名稱,屬性有:
 
-p:顯示所有變量值
 
-i:定義為整數
 
-r:定義為只讀變量
 
-a:定義為數組變量
 
-f:顯示所有自定義函數,包括名稱和函數體
 
-x:變量設置成環境變量,隨后的腳本和程序可以使用
 
例子:
 
x=6/3
 
echo "$x"                            //6/3
 
#定義變量x為整數
 
declare -i x
 
echo "$x"                          //6/3,因為shell中所有數據都當做字符串存儲
 
#將算術式賦給變量x
 
x=6/3
 
echo "$x"                         //2,變量聲明為整數后,可以進行算術運算
 
#將字符串賦給變量x
 
x=hello
 
echo "$x"
 
#將浮點數賦給變量x
 
x=3.14
 
echo "$x"                          //報錯,bash不支持浮點數
 
#取消變量x的整數屬性
 
declare +i x
 
#重新將算術式賦給變量x
 
x=6/3
 
echo "$x"
 
#求表達式的值
 
x=$[6/3]
 
echo "$x"                              //2,得到算術值得兩種方法,方括號
 
#求表達式的值
 
x=$((6/3))                             //2,得到算術值得兩種方法,圓括號
 
 
1.2 引號
 
單引號(‘’):括起來的字符作為普通字符
 
雙引號(“”):括起來的字符,除    “$”, “\”,  “`”和“``”保留其特殊功能外,其余仍作為普通字符
 
反引號(``):括起來的字串被解釋為命令,shell首先執行該命令,並以他的標准輸出結果取代整個反引號部分
 
#! /bin/bash
 
#輸出當前目錄
 
echo "current directory is `pwd`"
 
結果:currentdirectory is /root/chapter3
 
(先執行`pwd`,結果/root/chapter3取代`pwd`)
 
 
1.3 變量的作用域:
 
全局變量:shell中,全局變量可在腳本中定義,也可在某個函數中定義。腳本中定義的變量都為全局變量,作用域為被定義的地方開始,指定shell腳本結束或顯示刪除。
 
例:
 
#! /bin/bash
 
#定義函數
 
func()
 
{
 
   #輸出變量x的值
 
  echo "$v1" //100
 
   #修改變量x的值
 
  v1=200
 
}
 
#在腳本中定義變量x
 
v1=100
 
#調用函數
 
func
 
#輸出變量x的值
 
echo "$v1"  //200
 
局部變量:通常僅限某個程序段訪問,如函數內部。Shell中可在函數內部通過local關鍵字定義局部變量,另外函數的參數也是局部變量。
 
例:
 
#! /bin/bash
 
#定義函數
 
func()
 
{
 
   #使用local關鍵字定義局部變量
 
  local v2=200
 
}
 
#調用函數
 
func
 
#輸出變量的值
 
echo "$v2"    // 空值,函數外面不能獲得該變量的值
 
注意:全局變量與局部變量同名時,函數內部的局部變量優先被使用。無論在何處,賦值語句都會影響全局變量的值,全局變量的值改變后,最整個腳本都有效,默認情況下,函數內部定義的變量也是全局變量,除非用local聲明
 
 
1.4 系統變量:
 
Shell的系統變量主要對參數判斷和命令返回值判斷時的使用,包括腳本和函數的參數,以及腳本和函數的返回值。常用系統變量:
 
$n:表示傳遞給腳本的第n個參數,如$1表示第一個參數
 
$#:命令行參數的個數
 
$0:當前腳本名稱
 
$*:以“參數1參數2….”形式返回所有參數的值
 
$@:以“參數1”“參數2”形式返回所有參數的值
 
$_:保存之前執行的命令的最后一個參數
 
例子:
 
#! /bin/bash
 
#輸出腳本的參數個數
 
echo "thenumber of parameters is $#"
 
#輸出上一個命令的退出狀態碼
 
echo "thereturn code of last command is $?"
 
#輸出當前腳本名稱
 
echo "thescript name is $0"
 
#輸出所有的參數
 
echo "theparameters are $*"
 
#輸出其中的幾個參數
 
echo"\$1=$1;\$2=$2;\$11=$11"
 
1.5 環境變量:
 
 
Shell環境變量是所有shell程序都可以使用的變量。(全部大寫)
 
PATH:命令搜索路徑,以冒號為分隔符,當前目錄不在系統路徑里
 
HOME:用戶主目錄的路徑名,cd命令的默認參數
 
COLUMNS:命令編輯模式下可使用命令行長度
 
HISTSIZE:命令歷史文件中最多可包含的命令條數
 
HISTFILE:命令歷史文件
 
HISTFILESIZE:命令歷史文件中包含的最大行數
 
IFS:shell使用的分隔符
 
LOGNAME:當前的登入名
 
SHELL:Shell的全路徑名
 
TERM:終端類型
 
TMOUT:shell自動退出時間,單位秒,為0則禁止shell自動退出
 
PWD:當前工作目錄
 
可以使用set命令列出所有環節變量,set| more
 
例子:
 
#! /bin/bash
 
#輸出命令搜索路徑
 
echo"commands path is $PATH"
 
#輸出當前的登錄名
 
echo "currentlogin name is $LOGNAME"
 
#輸出當前用戶的主目錄
 
echo "currentuser's home is $HOME"
 
#輸出當前的Shell
 
echo "currentshell is $SHELL"
 
#輸出當前工作目錄
 
echo "currentpath is $PWD"
 
1.6 變量賦值和清空:
 
 
Shell中所有普通變量值都看作字符串,如果賦值包含空格,制表符和換行符,要用單引號或雙引號括起來,一個沒有初始化的shell變量被認為是一個空字符串。
 
1.7 清除變量:
 
 
 
 
變量被清除后,代表的值也會消失。消除變量用unset語句
 
 
 
unsetvariable_name
 
二 引用
 
2.1引用變量的值:
 
 
可通過在變量面前加$來獲取變量的值。
 
為了能使shell正確的界定變量名,可以在引用變量時使用大括號將變量括起來
 
如:
 
v4=123
 
echo “${v4}abc”
 
結果:123abc
 
(若直接echo “$v4abc”,會變成空字符串,因為v4abc沒有被定義)
 
2.2引用和替換:
 
 
引用:字符串用引用符合包括起來,防止特殊字符被shell解釋成其他含義
 
常用引用符號:
 
雙引號:除$,’’,``,\之外,其他所有字符保持字面意義
 
單引號:所有字符保持字面意義
 
反引號:反引號中的字符串被解釋為shell命令
 
反斜線:轉義字符,屏蔽后的字符的特殊意義
 
2.3全引用:
 
 
單引號引用的方式。
 
#! /bin/bash
 
#定義變量v1
 
v1="chunxiao"
 
#輸出含有變量名的字符串
 
echo 'Hello, $v1'  //全引用保持字面意義
 
結果:Hello ,$v1
 
2.4 部分引用:
 
 
雙引號引用方式
 
2.5 命令替換:
 
 
將某個shell命令的執行結果賦給某個變量。
 
兩種方式:
 
反引號:`shell_command`
 
圓括號:$(shell_command)
 
2.6轉義:
 
 
轉換某些特殊字符的意義,\表示。屏蔽反斜線后面字符的特殊意義
 
如:
 
Echo $SHELL
 
結果:/bin/bash
 
Echo \$SHELL
 
結果:$SHELL
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM