關於變量的內容linux
1、變量命名:
2、變量賦值:shell
3、變量類型:
4、變量取消:
5、取得變量值:編程
6、調整變量的屬性數組
7、數組
8、變量擴展:
9、命令擴展:
bash
1、變量名稱:
一、只能包含字母、數字和下劃線,而且不能以數字開頭,
二、不該該跟系統中已有的環境變量重名
三、最好能見名知意數據結構
2、變量賦值:less
設置變量:
變量名稱=值dom
var_name=value 等號兩邊不能有空格ssh
[root@lovelace 51cto]# youname=lovelace [root@lovelace 51cto]# echo $youname lovelace
針對數字,你能夠能夠這樣爲變量賦值,定義一個變量的類型ide
[root@lovelace 51cto]# declare -i sum=100 [root@lovelace 51cto]# echo $sum 100
3、bash:變量類型:
環境變量:
本地變量(局部變量):
位置變量:
特殊變量(系統變量):
本地變量:做用域爲整個bash進程
varname=value
局部變量:做用域只對當前代碼段有效
local varname=value
環境變量:做用域爲當前shell進程及其子進程
export varname=value "導出「
任意腳本在執行時會啓動一個子shell進程,
命令行中啓動的腳本會繼承當前shell的環境變量
系統自動執行的腳本(跟命令行無關)就須要自我定義須要的各環境變量
位置變量:
$1,$2,....
特殊變量:保持某些特殊數據
$? 上一個命令執行狀態返回值
$# 參數的個數
$* 參數列表
$@ 參數列表
$0 命令自己 腳本自己
執行腳本時的腳本路徑及名稱
程序執行通常有兩類返回值
程序執行結果;
執行狀態返回代碼(0-255)
0表示正確
1-255:錯誤執行 1,2,127 系統預留 有特殊意義
4、撤銷變量:
unset varname
[root@lovelace 51cto]# unset youname;echo $youname
查看當前shell中的變量
set 不帶任何參數和選項
[root@lovelace 51cto]# set BASH=/bin/bash BASH_ARGC=() BASH_ARGV=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu") BASH_VERSION='3.2.25(1)-release' COLORS=/etc/DIR_COLORS.xterm COLUMNS=80 CVS_RSH=ssh DIRSTACK=() EUID=0 GROUPS=() G_BROKEN_FILENAMES=1 HISTFILE=/root/.bash_history HISTFILESIZE=5000 HISTSIZE=5000 HOME=/root HOSTNAME=lovelace.localdomain HOSTTYPE=i386 IFS=$' \t\n' INPUTRC=/etc/inputrc LANG=zh_CN.GB2312 LC_ALL=zh_CN.GB2312 LESSOPEN='|/usr/bin/lesspipe.sh %s' LINES=20 LOGNAME=root LS_COLORS='no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:' MACHTYPE=i386-redhat-linux-gnu MAIL=/var/spool/mail/root MAILCHECK=60 OLDPWD=/home/scripts OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin PIPESTATUS=([0]="0") PPID=16933 PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' PS1='[\u@\h \W]\$ ' PS2='> ' PS4='+ ' PWD=/home/scripts/51cto SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SSH_CLIENT='192.168.2.28 8577 22' SSH_CONNECTION='192.168.2.28 8577 192.168.2.54 22' SSH_TTY=/dev/pts/0 SUPPORTED=zh_CN.UTF-8:zh_CN.GBK:zh_CN.GB2312:zh_CN:zh:en_US.UTF-8:en_US:en TERM=xterm UID=0 USER=root _=echo consoletype=pty sum=100 tmpid=0 x=101
若是查看當前shell中的環境變量
env
export
printenv
字符串變量添加新的變量
PATH添加新的路徑
export PATH=$PATH:/usr/local/apsch/bin
5、取得變量值:
$變量名稱
${變量名稱} $(x) 這個能夠用來當作命令調用
若是變量在語句當中被引用,必需要使用${x}才能夠,取得數組的變量值時候也須要使用${}來調用
[root@lovelace 51cto]# listnum=100 [root@lovelace 51cto]# echo $listnum 100 [root@lovelace 51cto]# echo ${listnum} 100
關於變量和引號的關係:
單引號:所見即所得
雙引號:使特殊符號生效
[root@lovelace 51cto]# echo "There are $listnum pelple." There are 100 pelple. [root@lovelace 51cto]# echo 'There are $listnum pelple.' There are $listnum pelple.
6、調整變量的屬性:
一、readonly 命令 :定義只讀變量
-p:顯示目前具備只讀屬性的變量列表
-f:設定函數不可修改
-a:定義數組不可修改
二、declare 命令
-r:設定只讀變量
-p:顯示變量的屬性
-a:變量是一個數組
-f:搜尋命令時,只找函數
-i:變量是一個整數
-F:顯示全部的函數式名稱及其屬性
-t:設立變量具備trace屬性
-x:設定環境變量
7、 數組:
是一種數據結構,有相關的數據項組成,每一個數據項,稱爲數組的元素,且可採用索引的方式取得個元素的值
數組賦值:
一、單個賦值,以index做爲索引號,索引號從0開始
a[0]=1
a[2]=2
a[3]=3
#爲數組賦值 [root@lovelace 51cto]# a[0]=1 [root@lovelace 51cto]# a[1]=2 [root@lovelace 51cto]# a[2]=3 #顯示數組中全部值方法一 [root@lovelace 51cto]# echo ${a[*]} 1 2 3 #顯示數組中全部值方法二 [root@lovelace 51cto]# echo ${a[@]} 1 2 3 #爲數組添加數據項 [root@lovelace 51cto]# a[3]='nick' [root@lovelace 51cto]# echo ${a[*]} 1 2 3 nick
二、使用小括號爲數組賦值
a=(1 2 3) 默認空格隔開
#爲數組b賦值 記住是小括號,不是大括號 [root@lovelace 51cto]# b=(bbs www http ftp) [root@lovelace 51cto]# echo ${b[*]} bbs www http ftp #打印出第一個和第三個數據項 [root@lovelace 51cto]# echo ${b[0]};echo '*******';echo ${b[2]} bbs ******* http
三、爲數組中的某一個數據項賦值,默認是從0開始,若是中間出現未比標示的索引項,則從前一個索引項開始計算
a={51 [3]=5 cto [6]=8}
#爲數組賦值 [root@lovelace 51cto]# c=(51cto [3]='nick' 51 [5]='lovelace') #打印出數組中全部值 [root@lovelace 51cto]# echo ${c[@]} 51cto nick 51 lovelace #驗證中間出現的數值是從哪一個索引項開始算起的 [root@lovelace 51cto]# echo ${c[1]} [root@lovelace 51cto]# echo ${c[0]} 51cto [root@lovelace 51cto]# echo ${c[2]} [root@lovelace 51cto]# echo ${c[4]} 51
顯示賦值:
echo ${a[1]}
取出數組中全部的值:
echo ${a[@]} 或者echo ${a[*]}
取得數組元素的個數:
echo ${#a[@]} 或者 echo ${#a[*]}
#打印出數組全部值,統計數組中數據項個數 [root@lovelace 51cto]# echo ${c[@]};echo ${#c[@]};echo ${#c[*]} 51cto nick 51 lovelace 4 4
8、高級變量:
${變量名稱} 變量擴展
$(命令) 命令替換
$((算術式)) 算術擴展
$(命令) 命令替換:
測試變量存在與否:
${myname:-'nick'} 判斷條件,若是myname存在,就返回值,若是myname不存在,就把-後接的字符串當作整個變量擴展的結果,並傳回
測試變量不存在或爲空,傳回一個默認值
${myname:-'nick'} 若是待測變量不存在或爲空,傳回-後的值,存在則傳回變量的值
測試變量不存在或爲空,給變量設定一個默認值
${count:=100} 若變量coutn沒有值或爲空,則把待測變量設定爲默認值,
測試變量不存在或爲空,傳回錯誤信息
${myname:?"your input error"}
測試變量的存在性:
${myname:+Ture} 若變量存在且值非空,則符合判斷
: 空 測空置
- 負向 測不存在
+ 正向 測存在
? 有問題 檢查是否完備後再來執行吧
= 設值 給控值變量設定一個默認值
$(命令) 命令替換 此命令等同於·· (esc下的按鍵,不是單引號)這個在編寫腳本的時候頗有用
#打印出當前路徑 [root@lovelace 51cto]# echo $(pwd) /home/scripts/51cto [root@lovelace 51cto]# echo `pwd` /home/scripts/51cto
$((算術式))算術擴展:這個咱們在下章將會單獨講解,這裏給出示例查看
[root@lovelace 51cto]# a=3;b=5 [root@lovelace 51cto]# echo $((a+b)) 8
9、變量擴展「去字符串切片,字符串長度
字符串切片是從0開始的 在使用${}的時候 大括號內的變量引用前面的$能夠不寫
${變量:位置起點} ${myname:3}
${變量:位置起點:長度}
#定義變量 [root@lovelace 51cto]# myname=lovelace #取得變量字符串從第三個字符開始到字符串結尾的全部字符 [root@lovelace 51cto]# echo ${myname:3} elace #取得變量字符串中從第四個字符開始,長度爲2的字符 [root@lovelace 51cto]# echo ${myname:4:2} la
取部分參數:
命令行參數是從$1開始的依次類推,$@表明全部參數,命令自己使用$0來表示
${@:起點}:由點開始,取得後面的全部的位置參數
${@:起點:個數}:由起點開始,取得指定個數的位置參數
示例腳本
#!/bin/bash #Verson:0.1 #Auther:lovelace #Pragram:test argument #取得程序名 echo $0 #取得變量的全部值 echo ${@:1} #取得變量的個數 echo $#
執行結果:
[root@lovelace 51cto]# ./argument.sh 12 32 45 ./argument.sh 12 32 45 3
計算字符串長度:
${#變量名稱}:傳回變量值的字符串長度
expr:也能夠統計字符串的長度
一、str="here you are."
len$(expr length "$str")
echo "str 字符串長度是:$len"
二、expr "字符串「:‘。*’
str="here you are."
len=$(expr "$str":'.*')
echo "str字符串長度是:$len"
[root@lovelace 51cto]# echo $myname lovelace #使用${#變量名}取得字符串長度 比較經常使用 [root@lovelace 51cto]# echo ${#myname} 8 #使用${expr length 「$變量名」}取得字符串長度 [root@lovelace 51cto]# len=$(expr length "$myname") [root@lovelace 51cto]# echo $len 8 #使用${expr 「$變量名」 : '.*'}取得字符串長度 [root@lovelace 51cto]# len=$(expr "$myname" : '.*') [root@lovelace 51cto]# echo $len 8
變量擴展:對比樣式
由字符串前面對比,刪除最短的
${變量#樣式}
由字符串前面對比,刪除最長的
${變量##樣式}
#定義一個變量 [root@lovelace 51cto]# path=$(pwd) #查看變量值 [root@lovelace 51cto]# echo $path /home/scripts/51cto #使用對比樣式 [root@lovelace 51cto]# echo ${path#*/} home/scripts/51cto #此對比樣式能夠取得目錄名 [root@lovelace 51cto]# echo ${path##/*/} 51cto
由字符串後面對比,刪除最短的
${變量%樣式}
由字符串後面對比,刪除最長的
${變量%%樣式}
#使用此對比樣式能夠取得路徑名 [root@lovelace 51cto]# echo ${path%/*} /home/scripts #使用此對比樣式沒有任何數據輸出 [root@lovelace 51cto]# echo ${path%%/*}
至於對比樣式能夠根據本身的思考來得到,這個沒有固定的格式
取代或刪除部分字符串:
只替換第一個對比符合的字符串
${變量/樣式/替換字符串}
替換全部符合的字符串
${變量//樣式/替換字符串}
#定義一個變量 [root@lovelace 51cto]# echo $myname lovelace #替換第一次出現的l爲F [root@lovelace 51cto]# echo ${myname/l/F} Fovelace #替換字符串中全部l爲F [root@lovelace 51cto]# echo ${myname//l/F} FoveFace
刪除對比符合的字符串
只刪一個
${變量/樣式/}
刪除所有
${變量//樣式/}
#T 行首位置
%LE 最後面
#定義一個變量獲取IP地址相關的信息 [root@lovelace 51cto]# tmp=$(ifconfig eth0 | grep 'inet addr') #刪除對比樣式成功的字符串 而後賦值給變量r [root@lovelace 51cto]# r=${tmp/inet addr:/} #刪除對比樣式成功的字符串 而後賦值給變量ip [root@lovelace 51cto]# ip=${r/ Bcast*/} #打印出變量ip 查看是否是咱們想要的結果 [root@lovelace 51cto]# echo $ip 192.168.2.54
變量擴展:取變量名稱列表、數組索引列表
取變量名稱列表:
${!開頭字符串@}或${!開頭字符串*}
[root@lovelace 51cto]# myname=lovelace;mytest=51cto [root@lovelace 51cto]# echo ${!my@} myname mytest [root@lovelace 51cto]# echo ${!my*} myname mytest
取數組索引列表:
${!數組變量[@]}或${!數組變量[*]}
#取得數組a的全部值 [root@lovelace 51cto]# echo ${a[@]} hello 2 3 nick #取得數組a的索引項 [root@lovelace 51cto]# echo ${!a[@]} 0 1 2 3
後記:學習shell編程,變量這一塊很重要,文章中列出的僅僅是變量內容的一部分,還有不少像系統內置變量,以及環境變量,局部變量之間的轉化,咱們這裏沒有說起到,因此須要咱們多練習、多總結。就算你一下記不住這麼多知識,熟能生巧老是能夠的吧......