shell實現數組和declare用法


shell實現數組和declare用法
2009
如何讓shell返回一個數組變量

總體上來說要利用 IFS這個內部變量,
但處理完應該立即恢復默認的IFS變量 ,不然將帶來一堆不可預知的問題。。。
以下是man bash對於IFS的介紹:
IFS The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read
builtin command. The default value is `` ''.

示例程序1、
export IFS=";"
sentence="one;two;three"
for word in $sentence; do
echo "$word"
done

示例程序2、
IFS=.;set -- $(echo 192.168.123.444) ;echo $4 $3 $2 $1 #記得要恢復IFS,或者unset IFS
以下是man bash對於set --的解釋:
-- If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters are
set to the args, even if some of them begin with a -.

示例程序3、
sentence="one;two;three"
sentence=${sentence//;/$'\n'} # change the semicolons to white space
for word in $sentence
do
echo "$word"
done

示例程序4、
igi:~$ var=(echo "a|b c")
igi:~$ echo ${var[0]}
a|b
igi:~$ echo ${var[1]}
c
igi:~$ IFS='[ |]'
igi:~$ var=(echo "a|b c")
igi:~$ echo ${var[0]}
a
igi:~$ echo ${var[1]}
b
igi:~$ echo ${var[2]}
c

$ var=(echo a b c)
$ echo ${abc[0]}
a
$ echo ${abc[1]}
b

示例程序5、

!/usr/bin/env bash

IN="bla@some.com;john@home.com"
arr=$(echo $IN | tr ";" "\n")
for x in $arr
do
echo "> [$x]"
done

示例程序6、
IN="bla@some.com;john@home.com"
OIFS=$IFS
IFS=';'
arr2=$IN
for x in $arr2
do
echo "> [$x]"
done
IFS=$OIFS #記得要恢復IFS的設置喲。。。

示例程序7、
IN="bla@some.com;john@home.com"
OIFS=$IFS
IFS=';'
arr2=($IN)
for x in ${arr2[@]} #index "@" stands for "expand each item in the array to a separate word"
do
echo "> [$x]"
done
IFS=$OIFS

示例程序8、
IN="bla@some.com;john@home.com"
set -- "$IN"
IFS=";"; declare -a Array=($*)
echo "${Array[@]}"
echo "${Array[0]}"
echo "${Array[1]}"

示例程序9、
利用awk的split函數返回一個數組:
awk 'BEGIN{split("a b c",array," ");for(i in array){print array[i]}}'

示例程序10、
有關bash的parameter expansion:
長度:${#p} ;訪問第15個參數:${@:15:1} 是一種直接訪問參數 15 的方法 ;${x:3:5} 變量x的子集
chj@linux-xzlr:trunk> AA="a bc d ef"
chj@linux-xzlr:trunk> BB="d"
chj@linux-xzlr:trunk> echo ${AA%%$BB*}
a bc
cjash@linux-sdik:dl> AAA=abcdef
cjash@linux-sdik:dl> echo ${AAA:2}
cdef
cjash@linux-sdik:dl> echo ${AAA-2}
abcdef
-bash-3.00$ echo ${AAA: -2}
ef
-bash-3.00$ echo ${AAA::2}
ab
-bash-3.00$
-bash-3.00$ echo ${AAA:-2} #:-2無效,直接被無視了~
abcdef
-bash-3.00$
cjash@linux-sdik:ppp> AAA=abcabcabc
cjash@linux-sdik:ppp> echo ${AAA%${AAA: -2}}
abcabca
cjash@linux-sdik:ppp>
更多內容請訪問:
http://blog.chinaunix.net/u1/47395/showart_1728391.html

shell數組和declare用法
20121030

用途說明
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是內建命令
[root@web ~]#type -a declare
declare is a shell builtin
[root@jfht ~]#type -a typeset
typeset is a shell builtin

示例二 declare -i之后可以直接對表達式求值
[root@web ~]#x=6/3
[root@web ~]#echo $x
6/3
[root@web ~]#declare -i x
[root@web ~]#echo $x
6/3
[root@web ~]#x=6/3
[root@web ~]#echo $x
2
如果變量被聲明成整數,可以把表達式直接賦值給它,bash會對它求值。

[root@jfht ~]#x=error
[root@jfht ~]#echo $x
0
如果變量被聲明成整數,把一個結果不是整數的表達式賦值給它時,就會變成0.

[root@jfht ~]#x=3.14
-bash: 3.14: syntax error: invalid arithmetic operator (error token is ".14")
如果變量被聲明成整數,把一個小數(浮點數)賦值給它時,也是不行的。因為bash並不內置對浮點數的支持。

[root@jfht ~]#declare +i x
此命令的結果是取消變量x的整數類型屬性。
[root@jfht ~]#x=6/3
[root@jfht ~]#echo $x
6/3
因為變量x不是整型變量,所以不會自動對表達式求值。可以采用下面兩個方式。
[root@jfht ~]#x=$[6/3]
[root@jfht ~]#echo $x
2
[root@jfht ~]#x=$((6/3))
[root@jfht ~]#echo $x
2

示例三 聲明只讀變量
[root@jfht ~]#declare -r r
[root@jfht ~]#echo $r
[root@jfht ~]#r=xxx
-bash: r: readonly variable
[root@jfht ~]#declare -r r=xxx
-bash: declare: r: readonly variable
[root@jfht ~]#declare +r r
-bash: declare: r: readonly variable
[root@jfht ~]#declare +r r
-bash: declare: r: readonly variable
[root@jfht ~]#
[root@jfht ~]#unset r
-bash: unset: r: cannot unset: readonly variable

示例四 聲明數組變量(實際上,任何變量都可以當做數組來操作)
[root@jfht ~]#declare -a names
[root@jfht ~]#names=Jack
[root@jfht ~]#echo ${names[0]}
Jack
[root@jfht ~]#names[1]=Bone
[root@jfht ~]#echo ${names[1]}
Bone
[root@jfht ~]#echo ${names}
Jack
[root@jfht ~]#echo ${names[]}
Jack Bone
[root@jfht ~]#echo ${#names}
4
直接引用names,相當於引用names[0]
[root@jfht ~]#echo ${#names[
]}
2
[root@jfht ~]#echo ${names[@]}
Jack Bone
[root@jfht ~]#echo ${#names[@]}
2
[root@jfht ~]#declare -p names
declare -a names='([0]="Jack" [1]="Bone")'

示例五 顯示函數定義
[root@jfht ~]#declare -F
declare -f add_jar
declare -f add_jar2
declare -f add_jar3
[root@jfht ~]#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
}
[root@jfht ~]#declare -f add_jar
add_jar ()
{
[ -e $1 ] && CLASSPATH=$CLASSPATH:$1
}
[root@jfht ~]#declare -F add_jar
add_jar
[root@jfht ~]#declare -F add_
[root@jfht ~]#declare -F add_*
[root@jfht ~]#declare -F 'add_*'
[root@jfht ~]#


免責聲明!

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



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