一 變量
變量:本質上是程序中保存用戶數據的一塊內存空間,變量名就是內存空間地址。
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