第九章 變數的進階用法

來源:互聯網
上載者:User

標籤:shell 變數的進階用法

內部變數

1.BASH

記錄了bash Shell的路徑(通常為/bin/bash)

[[email protected] tmp]# echo "$BASH"

/bin/bash

2.BASH_VERSINFO

為一個數組,分別儲存bash shell的主要版本號,此版本號碼,補丁層級,編譯版本,發行狀態,硬體架構

[[email protected] tmp]# cat c.sh 

#! /bin/bash

for n in 0 1 2 3 4 5

do

 echo "BASH_VERSINFO[$n]=${BASH_VERSINFO[$n]}"

done

[[email protected] tmp]# ./c.sh 

BASH_VERSINFO[0]=3

BASH_VERSINFO[1]=2

BASH_VERSINFO[2]=25

BASH_VERSINFO[3]=1

BASH_VERSINFO[4]=release

BASH_VERSINFO[5]=x86_64-redhat-linux-gnu

3.BASH_VERSION

和BASH_VERSINFO一樣,只不過用字串表示

[[email protected] tmp]# echo "$BASH_VERSION"

3.2.25(1)-release

4.目錄棧

用於存放工作目錄,便於程式員手動控制目錄的切換

[[email protected] tmp]# dirs    #顯示棧的所有內容,可以看見系統自動壓入目前的目錄(實質上先彈出棧頂目錄再壓入目前的目錄)

/tmp

[[email protected] tmp]# pushd /home  #壓入/home,後進先出,注意目錄變化

/home /tmp

[[email protected] home]# pushd /home/clc  #壓入/home/clc

/home/clc /home /tmp

[[email protected] clc]# popd    #彈出,注意目錄變化

/home /tmp

[[email protected] home]# pushd clc  #相對於目錄壓入,和壓入/home/clc效果一樣,注意目錄變化

/home/clc /home /tmp

[[email protected] clc]# echo $DIRSTACK   #顯示棧頂目錄

/home/clc

5.GLOBIGNORE(globbing,通配)

表示通配時候忽略(ignore)檔案名稱的集合,預設為空白

[[email protected] tmp]# ls a*

a   a1~     a2.awk  a3.sh   a4.sh  a6.sh  aac    all.tar.gz

a1  a1.awk  a3.awk  a4.awk  a5.sh  aabc   a.awk  a.sh

[[email protected] tmp]# GLOBIGNORE="a*.sh"

[[email protected] tmp]# ls a*

a  a1  a1~  a1.awk  a2.awk  a3.awk  a4.awk  aabc  aac  a.awk  all.tar.gz

6.GROUPS

以數組的形式儲存目前使用者所在的組

[[email protected] ~]# cat /etc/group | grep root

root:x:0:root

bin:x:1:root,bin,daemon

daemon:x:2:root,bin,daemon

sys:x:3:root,bin,adm

adm:x:4:root,adm,daemon

disk:x:6:root

wheel:x:10:root

[[email protected] ~]# echo $GROUPS

0

[[email protected] ~]# echo ${GROUPS[0]}

0

[[email protected] ~]# echo ${GROUPS[1]}

1

[[email protected] ~]# echo ${GROUPS[2]}

2

[[email protected] ~]# echo ${GROUPS[3]}

3

[[email protected] ~]# echo ${GROUPS[4]}

4

[[email protected] ~]# echo ${GROUPS[5]}

6

[[email protected] ~]# echo ${GROUPS[6]}

10

[[email protected] ~]# echo $GROUPS[6]  #注意要加{}才能當做整體

0[6]

7.HOSTNAME

記錄主機名稱,在/etc/sysconfig/network中設定主機名稱,在/etc/host中設定主機名稱和IP的對應關係

[[email protected] ~]# echo $HOSTNAME

localhost.localdomain

[[email protected] ~]# cat /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=no

HOSTNAME=localhost.localdomain

[[email protected] ~]# cat /etc/hosts

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1               localhost.localdomain localhost

192.168.127.135         localhost.localdomain

::1             localhost6.localdomain6 localhost6

8.HOSTTYPE和MACHTYPE

記錄系統的硬體架構,和BASH_VERSINFO[5]等價

[[email protected] ~]# echo ${BASH_VERSINFO[5]}

x86_64-redhat-linux-gnu

[[email protected] ~]# echo $HOSTTYPE

x86_64

[[email protected] ~]# echo $MACHTYPE

x86_64-redhat-linux-gnu


9.REPLY

如果read後面不跟參數則預設儲存在REPLY中

在

select variable [in list]

do

...

break

done

中,REPLY用於儲存使用者選擇的數字

例:

1.

[[email protected] ~]# read

clc

[[email protected] ~]# echo $REPLY

clc

[[email protected] ~]# read name    #有跟變數則儲存在變數中不儲存在REPLY中

clc1

[[email protected] ~]# echo $REPLY

clc

2.

[[email protected] ~]# cat d.sh 

#! /bin/bash

select name in "clc" "clc1" "clc2"

do

echo "\$REPLY is $REPLY"

echo "you select $name"

break

done

[[email protected] ~]# ./d.sh 

1) clc

2) clc1

3) clc2

#? 2

$REPLY is 2

you select clc1

10.SECONDS

記錄指令碼的執行時間(單位為秒)

有類型變數

declare [選項] 變數名

選項:

-r 設定為唯讀

-i 定義為整數

-a 定義為數組

-f 顯示此指令碼前定義過的所有函數名及其內容

-F 僅顯示此指令碼前定義過的所有函數名

-x 將變數聲明為環境變數

例:

[[email protected] ~]# num=2012

[[email protected] ~]# num1=$num+1  #以字元方式處理

[[email protected] ~]# echo $num1

2012+1

[[email protected] ~]# let "num1=$num+1" #以數字方式處理

[[email protected] ~]# echo $num1

2013

[[email protected] ~]# declare -i num1  #把num1當做整數類型

[[email protected] ~]# num1=$num+1

[[email protected] ~]# echo $num1

2013

間接引用

第一個變數的值是第二個變數的名字,從第一個變數引用第二個變數的值成為間接變數引用

例:

1.

[[email protected] ~]# variable1=variable2

[[email protected] ~]# variable2=value

[[email protected] ~]# echo ${!variable1}  #間接變數引用

value

2.資料庫

[[email protected] ~]# cat b1.sh

#! /bin/bash

#database

s01_name=clc1

s01_id=001

s02_name=clc2

s02_id=002

s03_name=clc3

s03_id=003

select choice in "s01" "s02" "s02"

do

name=${choice}_name

id=${choice}_id

echo "name:${!name}"

echo "id:${!id}"

break

done

結果:

[[email protected] ~]# ./b1.sh

1) s01

2) s02

3) s02

#? 2

name:clc2

id:002

註:間接引用變數中,第一個變數存放的是最終值的地址,實現了類似指標的功能

浮點數運算

工具:bc

[[email protected] ~]# bc

bc 1.06

Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.

This is free software with ABSOLUTELY NO WARRANTY.

For details type `warranty‘. 

3.2*2*2

12.8

r=3

7/(r+r)

1

scale=4

7/(r+r)

1.1666

quit

指令碼運算:

[[email protected] ~]# cat b2.sh

#! /bin/bash

value1=1.1

value2=`echo "scale=10;$value1*$value1" | bc`    #``中的內容解析成系統命令

value3=`echo "scale=10;$value2*$value2" | bc`

echo "vlaue1=$value;value2=$value1*$value1=$value2;value3=$value2*$value2=$value3"

[[email protected] ~]# ./b2.sh

vlaue1=;value2=1.1*1.1=1.21;value3=1.21*1.21=1.4641


本文出自 “flyclc” 部落格,請務必保留此出處http://flyclc.blog.51cto.com/1385758/1540286

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.