1. 程式人生 > >shell陣列和declare用法

shell陣列和declare用法

用途說明

declare命令是bash的一個內建命令,它可以用來宣告shell變數,設定變數的屬性(Declare variables and/or give them attributes)。該命令也可以寫作typeset。雖然人們很少使用這個命令,如果知道了它的一些用法,就會發現這個命令還是挺有用的。

常用引數

格式:declare

格式:typeset

格式:declare -p

格式:typeset -p

顯示所有變數的值。

格式:declare -p var

格式:typeset -p var

顯示指定變數var的值。

格式:declare var=value

格式:typeset var=value

格式:var=value

宣告變數並賦值。

格式:declare -i var

格式:typeset -i var

將變數var定義成整數。在之後就可以直接對錶達式求值,結果只能是整數。如果求值失敗或者不是整數,就設定為0。

格式:declare -r var

格式:typeset -r var

格式:readonly var

將變數var宣告為只讀變數。只讀變數不允許修改,也不允許刪除。

格式:declare -a var

格式:typeset -a var

將變數var宣告為陣列變數。但這沒有必要。所有變數都不必顯式定義就可以用作陣列。事實上,在某種意義上,似乎所有變數都是陣列,而且賦值給沒有下標的變數與賦值給"[0]"相同。

格式:declare -f

格式:typeset -f

顯示所有自定義函式,包括名稱和函式體。

格式:declare -F

格式:typeset -F

顯示所有自定義函式名稱。

格式:declare -f func

格式:typeset -f func

只顯示指定函式func的函式定義。

格式:declare -x var

格式:typeset -x var

格式:export var

將變數var設定成環境變數,這樣在隨後的指令碼和程式中可以使用。

格式:declare -x var=value

格式:typeset -x var=value

格式:export var=value

將變數var設定陳環境變數,並賦值為value。

使用示例

示例一 declare是內建命令

[[email protected] ~]#type -a declare 
declare is a shell builtin
[[email protected] ~]#

[[email protected] ~]#type -a typeset 
typeset is a shell builtin
[[email protected] ~]#

示例二 declare -i之後可以直接對錶達式求值

[[email protected] ~]#x=6/3 
[[email protected] ~]#echo $x 
6/3
[[email protected] ~]#declare -i x 
[[email protected] ~]#echo $x    
6/3
[[email protected] ~]#x=6/3 
[[email protected] ~]#echo $x 
2

如果變數被宣告成整數,可以把表示式直接賦值給它,bash會對它求值。

[[email protected] ~]#x=error 
[[email protected] ~]#echo $x 
0

如果變數被宣告成整數,把一個結果不是整數的表示式賦值給它時,就會變成0.

[[email protected] ~]#x=3.14 
-bash: 3.14: syntax error: invalid arithmetic operator (error token is ".14")
如果變數被宣告成整數,把一個小數(浮點數)賦值給它時,也是不行的。因為bash並不內建對浮點數的支援。 
[[email protected] ~]#

[[email protected] ~]#declare +i x

此命令的結果是取消變數x的整數型別屬性。 
[[email protected] ~]#x=6/3 
[[email protected] ~]#echo $x 
6/3

因為變數x不是整型變數,所以不會自動對錶達式求值。可以採用下面兩個方式。

[[email protected] ~]#x=$[6/3] 
[[email protected] ~]#echo $x
2
[[email protected] ~]#x=$((6/3)) 
[[email protected] ~]#echo $x  
2
[[email protected] ~]#

示例三 宣告只讀變數

[[email protected] ~]#declare -r r 
[[email protected] ~]#echo $r 

[[email protected] ~]#r=xxx 
-bash: r: readonly variable
[[email protected] ~]#declare -r r=xxx 
-bash: declare: r: readonly variable
[[email protected] ~]#declare +r r   
-bash: declare: r: readonly variable
[[email protected] ~]#
[[email protected] ~]#declare +r r 
-bash: declare: r: readonly variable
[[email protected] ~]#
[[email protected] ~]#unset r 
-bash: unset: r: cannot unset: readonly variable
[[email protected] ~]#

示例四 宣告陣列變數(實際上,任何變數都可以當做陣列來操作)

[[email protected] ~]#declare -a names 
[[email protected] ~]#names=Jack 
[[email protected] ~]#echo ${names[0]} 
Jack
[[email protected] ~]#names[1]=Bone 
[[email protected] ~]#echo ${names[1]} 
Bone
[[email protected] ~]#echo ${names} 
Jack
[[email protected] ~]#echo ${names[*]} 
Jack Bone
[[email protected] ~]#echo ${#names} 
4

直接引用names,相當於引用names[0] 
[[email protected] ~]#echo ${#names[*]} 
2

[[email protected] ~]#echo ${names[@]} 
Jack Bone
[[email protected] ~]#echo ${#names[@]} 
2

[[email protected] ~]#declare -p names   
declare -a names='([0]="Jack" [1]="Bone")'
[[email protected] ~]#

示例五 顯示函式定義

[[email protected] ~]#declare -F 
declare -f add_jar
declare -f add_jar2
declare -f add_jar3
[[email protected] ~]#declare -f 
add_jar ()
{
    [ -e $1 ] && CLASSPATH=$CLASSPATH:$1
}
add_jar2 ()
{
    if [ -e $1 ]; then
        CLASSPATH=$CLASSPATH:$1;
    else
        if [ -e $2 ]; then
            CLASSPATH=$CLASSPATH:$2;
        fi;
    fi
}
add_jar3 ()
{
    if [ -e $1 ]; then
        CLASSPATH=$CLASSPATH:$1;
    else
        if [ -e $2 ]; then
            CLASSPATH=$CLASSPATH:$2;
        else
            if [ -e $3 ]; then
                CLASSPATH=$CLASSPATH:$3;
            fi;
        fi;
    fi
}
[[email protected] ~]#declare -f add_jar 
add_jar ()
{
    [ -e $1 ] && CLASSPATH=$CLASSPATH:$1
}
[[email protected] ~]#declare -F add_jar 
add_jar
[[email protected] ~]#declare -F add_ 
[[email protected] ~]#declare -F add_* 
[[email protected] ~]#declare -F 'add_*' 
[[email protected] ~]#

問題思考

相關資料

【1】Aric小屋 Linux bash shell之declare
http://www.cnblogs.com/fhefh/archive/2011/04/22/2024857.html
【2】譯言網 Bash中的declare語句
http://article.yeeyan.org/view/20180/38866
【3】Advanced Bash-Scripting Guide:  9.2. Typing variables: declare or typeset
http://tldp.org/LDP/abs/html/declareref.html
【4】Advanced Bash-Scripting Guide:  Chapter 27. Arrays
http://tldp.org/LDP/abs/html/arrays.html#ARRAYREF
【5】php_boy的專欄 bash (4) declare getopts noclobber
http://blog.csdn.NET/php_boy/article/details/6416740

相關推薦

shell陣列declare用法

用途說明 declare命令是bash的一個內建命令,它可以用來宣告shell變數,設定變數的屬性(Declare variables and/or give them attributes)。該命令也可以寫作typeset。雖然人們很少使用這個命令,如果知道了它的一些用

Shell陣列函式

陣列中可以存放多個值。Bash Shell 只支援一維陣列(不支援多維陣列)。 Shell 陣列用括號來表示,元素用"空格"符號分割開,語法格式如下: array_name=(value1 ... valuen) 2.陣列常用操作 1)定義一個數組: myarray=(1 2 3 4 5);

shell陣列變數的應用

專案中有一個需求:使用者選擇test1,test2,…test10之間的一個變數(env),我用這個變數作為docker的名稱去建立一個新的容器。其中埠號也是之前預訂好的,需要指定兩個,一個是ssh22埠的,一個是JAVA專案的,比如30001。 新起一個docker的命令如下: docke

03 . Shell陣列函式

#### Shell陣列 ##### 簡介 > 陣列中可以存放多個值。Bash Shell 只支援一維陣列(不支援多維陣列),初始化時不需要定義陣列大小(與 PHP 類似)。 > > 與大部分程式語言類似,陣列元素的下標由0開始。 > > Shell 陣列用括號來表示,元素用"空格"符號分割開,語法格式如

shell陣列關聯陣列

陣列和關聯陣列 #!/bin/bash #定義陣列1 array_var1=(1 2 3 4 5 6)# #定義陣列2 array_var[0]="test1" array_var[1]="test2" array_var[2]="test3"

陣列ArrayList的區別及ArrayList的常用API的用法

1.陣列 陣列在記憶體中是連續儲存的,優點是它的索引速度非常快,而且賦值與修改元素較快,不足是在陣列中插入資料比較麻煩,同時宣告陣列時應知名陣列的長度,若陣列長度過長會造成記憶體浪費,陣列長度過短,會造成資料溢位的錯誤。 1.1 例項: string[] s=new string

陣列字串的方法與用法陣列去重);

補充知識點:基類(object)的子類有哪些?Function,Array,Number,Boolean,String,Date,Math,RegExp       String的兩種寫法:var st=new String("hello world")    var st="hello

shell指令碼中 陣列的基本用法

在shell指令碼中,陣列 也是一種常用的資料結構,這篇文章簡單 說一下 陣列的基本用法. 1 陣列的宣告 這樣就可以 宣告 arr  ,和 iplist 的陣列 #陣列的宣告 # 用 declare -a variable 語句來清楚地指定一個數組 # 宣告一個數組

c++ 11 陣列 lambda表示式 語法 / 函式包裝器 基本用法

//倒敘遍歷陣列並輸出  // []裡面的變數可以當做返回值來理解 (int x) 這裡就是每次迭代器的值,也就是陣列的元素的值 void main() { array<int, 5>

javascript中li標籤的排序陣列sort的用法 javascript中li標籤的排序陣列sort的用法

  轉: javascript中li標籤的排序和陣列sort的用法 1 2 3 4 5

陣列鄰接表的BFS基礎用法

對於BFS的原理在此處就不在講述,我們直接將具體的例項。首先是結構為陣列的情況下BFS的使用:int N = 10000;//隨意大小int map[N][N]  //圖的結構bool  visit[N];//將其初始化為falsevoid BFS1 (int G[][],

一維陣列二維陣列的定義及用法

一維陣列的定義型別說明符  陣列名 [常量表達式];在此說明:常量表達式必須是常量和常量符號。常量表達式定義了陣列的長度。在巨集定義中#define定義一個符號常量,則這個符號常量可以用來宣告陣列的個數#define n=9.....int arr[n];一維陣列的引用陣列必

shell中建立陣列遍歷

linux 中定義一個數據的語法為: variable=(arg1 arg2 arg3 ....) 中間用空格分開。陣列的下標從0開始。 1  獲取下標為n的元素: variable[n] 而且不存在陣列下標溢位的情況,如果 n>= 陣列的長度,那麼為空,

shell裡 (())set -u 用法

腳本里寫有: set -u ((ret=ret+$?)) ret沒定義,報錯 ret: unbound variable,導致指令碼直接返回狀態0.後面捕捉不到錯誤,如果命令列執行,就可以捕捉到錯誤。 具體原因: set -u Treat unset variables

Linux shell 中的陣列關聯陣列

寫在前面的話 我用開始廢柴了,這個又是寫給我自己看的了。 普通陣列 1.陣列的定義 在Linux shell中定義一個普通的陣列很簡單,首先我們先給陣列命名(當然要符合所有的命名規則咯)。定義陣列的一般格式就是: array_name=(element1 eleme

numpy擴充陣列函式之repeattile用法

tile函式是模板numpy.lib.shape_base中的函式。 函式的形式是tile(A,reps) 函式引數說明中提到A和reps都是array_like的,什麼是array_like的parameter呢?在網上查了一下,始終搞不明白,便把熟悉的python資料型別都試了一下,得出以下結論。 A的

linux shell陣列關聯陣列

陣列:像C語言中的陣列是同一種意思 #!/bin/bash #陣列 num_value=(1 2 3 4 5) echo ${num_value[*]} echo ${num_value[@]}

Scala陣列,定長陣列變長陣列,增強for迴圈,until用法陣列轉換,陣列常用演算法,陣列其它操作

1. 陣列 1.1. 定長陣列和變長陣列 package cn.toto.scala //可變陣列的長度時需要引入這個包 import scala.collection.mutable.A

shell 中 if else 用法詳解

基本語法 shell的if語法和C語言等高階語言非常相似,唯一需要注意的地方就是shell的if語句對空格方面的要求比較嚴格(其實shell對所有語法的空格使用都比較嚴格),如果在需要空格的地方沒有打上空格,都會報錯。如if [ $1x == "ip"x ];then ec

shell 向函式傳遞陣列從函式返回陣列的一個細節問題

function arraydblr { local origarray local newarray local elements local i origar