面的代码值得一试。另外一种Bomb的可能是,变量后面需要接其它字符串,比如$FRUITs。如果想让解释器识别成$FRUIT变量,而不是$FRUITs,需要用花括号括起来,像${FRUIT}s
数组和关联数组Bash中可以使用两种容器。
一种是数组,另一种是关联数组,类似于其他语言中的Map/Hash/Dict。
声明数组的常用语法: declare -a ARY或者ARY=(1 2 3)
声明关联数组的唯一语法: declare -A MAP
赋值的语法:
直接ARY[N]=VALUE,N可以是数字索引也可以是键。关联数组可以使用MAP=([x]=a [y]=b)进行多项赋值,注意这是赋值的语句而不是声明。
亲测数组中的索引不一定要按顺序来,你可以先给2和3上的元素赋值。(同样算是弱类型的Javascript也支持这种无厘头赋值,这算通病么?)
往现有数组批量添加元素:
ARY+=(a b c) MAP+=([a]=1 [b]=2)
1
2ARY+=(a b c)
MAP+=([a]=1 [b]=2)
取值:
${ARY[INDEX]} ${MAP[KEY]}
1
2${ARY[INDEX]}
${MAP[KEY]}
注意花括号的使用
${A[@]} 展开成所有的变量,而获取数组长度使用 ${#A[@]}
切片:
${ARY[@]:N:M} N是offset而M是length
返回索引,相当于keys():
${!MAP[@]}
试试下面的代码:
declare -a ARY declare -A MAP MAP+=([a]=1 [b]=2) ARY+=(a b c) echo ${ARY[1]} echo ${MAP[a]} echo "${ARY[@]}" echo "${MAP[@]}" echo "${ARY[@]:0:1}" echo ${#ARY[@]} echo "${!MAP[@]}" ARY[4]=a echo ${ARY[@]} echo ${ARY[3]}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16declare -a ARY
declare -A MAP
MAP+=([a]=1 [b]=2)
ARY+=(a b c)
echo ${ARY[1]}
echo ${MAP[a]}
echo "${ARY[@]}"
echo "${MAP[@]}"
echo "${ARY[@]:0:1}"
echo ${#ARY[@]}
echo "${!MAP[@]}"
ARY[4]=a
echo ${ARY[@]}
echo ${ARY[3]}
变量(字符串)变换Bash中的变量变换,大体是${变量[操作符]}的形式
大小写变换
HI=HellO echo "$HI" # HellO echo ${HI^} # HellO echo ${HI^^} # HELLO echo ${HI,} # hellO echo ${HI,,} # hello echo ${HI~} # hellO echo ${HI~~} #hELLo
1
2
3
4
5
6
7
8
9HI=HellO
echo "$HI" # HellO
echo ${HI^} # HellO
echo ${HI^^} # HELLO
echo ${HI,} # hellO
echo ${HI,,} # hello
echo ${HI~} # hellO
echo ${HI~~} #hELLo^大写,,小写, ~大小写切换
重复一次只修改首字母,重复两次则应用于所有字母。
混着用会怎样?
echo ${HI^,^} # HellO
看来是不行的×_×
移除匹配的字符串%xx 从后往前,开始匹配,移除匹配的内容
%%xx 跟上面的差不多,不过这是贪婪匹配
#xx 从前往后,开始匹配,移除匹配的内容
##xx 跟上面的差不多,不过这是贪婪匹配
这个比较难理解,不过看下面几个例子应该能明白了。
FILENAME=/home/spacewander/param.sh echo ${FILENAME%/*} # /home/spacewander echo ${FILENAME%%/*} # echo ${FILENAME#*/} # home/spacewander/param.sh echo ${FILENAME##*/} # param.sh
1
2
3
4
5FILENAME=/home/spacewander/param.sh
echo ${FILENAME%/*} # /home/spacewander
echo ${FILENAME%%/*} #
echo ${FILENAME#*/} # home/spacewander/param.sh
echo ${FILENAME##*/} # param.sh
查找并替换/MATCH/VALUE 替换第一个匹配的内容。
//MATCH/VALUE 替换匹配的内容
echo ${FILENAME/home/office} # /office/spacewander/param.sh echo ${FILENAME//s/S} # /home/Spacewander/param.Sh
1
2echo ${FILENAME/home/office} # /office/spacewander/param.sh
echo ${FILENAME//s/S} # /home/Spacewander/param.Sh
其它字符串操作获取变量(字符串)长度:${#FILENAME}
字符串切片:跟数组切片是同样的语法,${STR:offset:len}
TEXT=这个程序充满了BUG! echo ${TEXT:0:8} echo ${TEXT:4} # 你还可以使用负数作为offset,这时候就是从后往前算起。注意负数要用括号括起来,避免冲突。 echo ${TEXT:(-4)}
1
2
3
4
5
6TEXT=这个程序充满了BUG!
echo ${TEXT:0:8}
echo ${TEXT:4}
# 你还可以使用负数作为offset,这时候就是从后往前算起。注意负数要用括号括起来,避免冲突。
echo ${TEXT:(-4)}
关于变量,其它的内容Bash中有一项特性,你可以方便地检查某个变量是否设置了,如果没有设置,就赋予一个默认值。尤其在处理环境变量的时候,这项特性会让你感到欣慰。
语法是${VAR:=VALUE}或者${VAR:=VALUE}。此外,还有一个相似的语法,${VAR:=VALUE}和${VAR:=VALUE}。
下面展示下两者的区别
# expand to default variable echo ${NULL-"Not null"} # Not null echo ${NULL} # # set default variable echo ${NIL="Not nil"} # Not nil echo ${NIL} # Not nil
1
2
3
4
5
6
7# expand to default variable
echo ${NULL-"Not null"} # Not null
echo ${NULL} #
# set default variable
echo ${NIL="Not nil"} # Not nil
echo ${NIL} # Not nil可以看出,前者只是当变量不存在时,展开成指定的值。而后者在变量不存在时,将变量的值设置为指定值。
最后介绍一个,当目标变量不存在时,指定报错信息的语法。
数组和关联数组Bash中可以使用两种容器。
一种是数组,另一种是关联数组,类似于其他语言中的Map/Hash/Dict。
声明数组的常用语法: declare -a ARY或者ARY=(1 2 3)
声明关联数组的唯一语法: declare -A MAP
赋值的语法:
直接ARY[N]=VALUE,N可以是数字索引也可以是键。关联数组可以使用MAP=([x]=a [y]=b)进行多项赋值,注意这是赋值的语句而不是声明。
亲测数组中的索引不一定要按顺序来,你可以先给2和3上的元素赋值。(同样算是弱类型的Javascript也支持这种无厘头赋值,这算通病么?)
往现有数组批量添加元素:
ARY+=(a b c) MAP+=([a]=1 [b]=2)
1
2ARY+=(a b c)
MAP+=([a]=1 [b]=2)
取值:
${ARY[INDEX]} ${MAP[KEY]}
1
2${ARY[INDEX]}
${MAP[KEY]}
注意花括号的使用
${A[@]} 展开成所有的变量,而获取数组长度使用 ${#A[@]}
切片:
${ARY[@]:N:M} N是offset而M是length
返回索引,相当于keys():
${!MAP[@]}
试试下面的代码:
declare -a ARY declare -A MAP MAP+=([a]=1 [b]=2) ARY+=(a b c) echo ${ARY[1]} echo ${MAP[a]} echo "${ARY[@]}" echo "${MAP[@]}" echo "${ARY[@]:0:1}" echo ${#ARY[@]} echo "${!MAP[@]}" ARY[4]=a echo ${ARY[@]} echo ${ARY[3]}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16declare -a ARY
declare -A MAP
MAP+=([a]=1 [b]=2)
ARY+=(a b c)
echo ${ARY[1]}
echo ${MAP[a]}
echo "${ARY[@]}"
echo "${MAP[@]}"
echo "${ARY[@]:0:1}"
echo ${#ARY[@]}
echo "${!MAP[@]}"
ARY[4]=a
echo ${ARY[@]}
echo ${ARY[3]}
变量(字符串)变换Bash中的变量变换,大体是${变量[操作符]}的形式
大小写变换
HI=HellO echo "$HI" # HellO echo ${HI^} # HellO echo ${HI^^} # HELLO echo ${HI,} # hellO echo ${HI,,} # hello echo ${HI~} # hellO echo ${HI~~} #hELLo
1
2
3
4
5
6
7
8
9HI=HellO
echo "$HI" # HellO
echo ${HI^} # HellO
echo ${HI^^} # HELLO
echo ${HI,} # hellO
echo ${HI,,} # hello
echo ${HI~} # hellO
echo ${HI~~} #hELLo^大写,,小写, ~大小写切换
重复一次只修改首字母,重复两次则应用于所有字母。
混着用会怎样?
echo ${HI^,^} # HellO
看来是不行的×_×
移除匹配的字符串%xx 从后往前,开始匹配,移除匹配的内容
%%xx 跟上面的差不多,不过这是贪婪匹配
#xx 从前往后,开始匹配,移除匹配的内容
##xx 跟上面的差不多,不过这是贪婪匹配
这个比较难理解,不过看下面几个例子应该能明白了。
FILENAME=/home/spacewander/param.sh echo ${FILENAME%/*} # /home/spacewander echo ${FILENAME%%/*} # echo ${FILENAME#*/} # home/spacewander/param.sh echo ${FILENAME##*/} # param.sh
1
2
3
4
5FILENAME=/home/spacewander/param.sh
echo ${FILENAME%/*} # /home/spacewander
echo ${FILENAME%%/*} #
echo ${FILENAME#*/} # home/spacewander/param.sh
echo ${FILENAME##*/} # param.sh
查找并替换/MATCH/VALUE 替换第一个匹配的内容。
//MATCH/VALUE 替换匹配的内容
echo ${FILENAME/home/office} # /office/spacewander/param.sh echo ${FILENAME//s/S} # /home/Spacewander/param.Sh
1
2echo ${FILENAME/home/office} # /office/spacewander/param.sh
echo ${FILENAME//s/S} # /home/Spacewander/param.Sh
其它字符串操作获取变量(字符串)长度:${#FILENAME}
字符串切片:跟数组切片是同样的语法,${STR:offset:len}
TEXT=这个程序充满了BUG! echo ${TEXT:0:8} echo ${TEXT:4} # 你还可以使用负数作为offset,这时候就是从后往前算起。注意负数要用括号括起来,避免冲突。 echo ${TEXT:(-4)}
1
2
3
4
5
6TEXT=这个程序充满了BUG!
echo ${TEXT:0:8}
echo ${TEXT:4}
# 你还可以使用负数作为offset,这时候就是从后往前算起。注意负数要用括号括起来,避免冲突。
echo ${TEXT:(-4)}
关于变量,其它的内容Bash中有一项特性,你可以方便地检查某个变量是否设置了,如果没有设置,就赋予一个默认值。尤其在处理环境变量的时候,这项特性会让你感到欣慰。
语法是${VAR:=VALUE}或者${VAR:=VALUE}。此外,还有一个相似的语法,${VAR:=VALUE}和${VAR:=VALUE}。
下面展示下两者的区别
# expand to default variable echo ${NULL-"Not null"} # Not null echo ${NULL} # # set default variable echo ${NIL="Not nil"} # Not nil echo ${NIL} # Not nil
1
2
3
4
5
6
7# expand to default variable
echo ${NULL-"Not null"} # Not null
echo ${NULL} #
# set default variable
echo ${NIL="Not nil"} # Not nil
echo ${NIL} # Not nil可以看出,前者只是当变量不存在时,展开成指定的值。而后者在变量不存在时,将变量的值设置为指定值。
最后介绍一个,当目标变量不存在时,指定报错信息的语法。
http://rfdh4t4h.weebly.com/
http://rfbth.weebly.com/
http://arefdbfdb.weebly.com/
http://grethfgerb.weebly.com/
http://sgwgrfb.weebly.com/
http://wedgfvbrh.weebly.com/
http://ewdgvfeg.weebly.com/
http://4ergfergf.weebly.com/
http://edsgvf.weebly.com/
http://4werfhdvb.weebly.com/
http://chairwoman86.weebly.com/
http://wegfdb5.weebly.com/
http://333wwwbmw38com.weebly.com/
http://45tyjhjyh.weebly.com/
http://333wwwsuncity288com.weebly.com/
http://wergdbbb.weebly.com/
http://erfhdrthgbn.weebly.com/
http://edgfcv1.weebly.com/
http://edfgv1v.weebly.com/
http://wedfcv0.weebly.com/
http://galyon1233.weebly.com/
http://4erfgbgr.weebly.com/
http://rfdbfvb.weebly.com/
http://refgvbn0.weebly.com/
http://b6f0f00b.weebly.com/
http://6y7ikjm.weebly.com/
http://4wrgfvb.weebly.com/
http://46yndv.weebly.com/
http://edgfedvc.weebly.com/
http://efgdvdv.weebly.com/
http://sgr4wtrgf.weebly.com/
http://rt2g0g.weebly.com/
http://egwerfdgbv0.weebly.com/
http://wrhtfg.weebly.com/
http://grgfvb.weebly.com/
http://rdfbvegfb.weebly.com/
http://ardf1b0.weebly.com/
http://aerfgbth.weebly.com/
http://shb5trhg.weebly.com/
http://asrg54ty4h.weebly.com/
http://wegfrg.weebly.com/
http://wrehfgbn.weebly.com/
http://sfvb6fb.weebly.com/
http://sdgw4ergf.weebly.com/
http://sgbffb.weebly.com/
http://wrgfbb.weebly.com/
http://gew4refg.weebly.com/
http://fdsdfsdfrgrf.weebly.com/
http://atrh2h.weebly.com/
http://788netd.weebly.com/
http://manner8184.weebly.com/
http://sdgwedrfv.weebly.com/
http://shiboyulesd.weebly.com/
http://df84f1.weebly.com/
http://gfj2hj2.weebly.com/
http://agagds.weebly.com/
http://333www590.weebly.com/
http://33www7t789com.weebly.com/
http://wegdfbv.weebly.com/
http://egdsvbfbv.weebly.com/
http://rhgbn33.weebly.com/
http://playblockm.weebly.com/
http://wergfvbb.weebly.com/
http://ergfbb.weebly.com/
http://wrfdgvbn.weebly.com/
http://egwefb.weebly.com/
http://edsgbvfb.weebly.com/
http://sdd2f000cc.weebly.com/
http://w4etr2f.weebly.com/
http://dgf2jkn.weebly.com/
http://sd1v0dfv.weebly.com/
http://sdfghregbf.weebly.com/
http://sdgwrgfbv.weebly.com/
http://rfbth.weebly.com/
http://arefdbfdb.weebly.com/
http://grethfgerb.weebly.com/
http://sgwgrfb.weebly.com/
http://wedgfvbrh.weebly.com/
http://ewdgvfeg.weebly.com/
http://4ergfergf.weebly.com/
http://edsgvf.weebly.com/
http://4werfhdvb.weebly.com/
http://chairwoman86.weebly.com/
http://wegfdb5.weebly.com/
http://333wwwbmw38com.weebly.com/
http://45tyjhjyh.weebly.com/
http://333wwwsuncity288com.weebly.com/
http://wergdbbb.weebly.com/
http://erfhdrthgbn.weebly.com/
http://edgfcv1.weebly.com/
http://edfgv1v.weebly.com/
http://wedfcv0.weebly.com/
http://galyon1233.weebly.com/
http://4erfgbgr.weebly.com/
http://rfdbfvb.weebly.com/
http://refgvbn0.weebly.com/
http://b6f0f00b.weebly.com/
http://6y7ikjm.weebly.com/
http://4wrgfvb.weebly.com/
http://46yndv.weebly.com/
http://edgfedvc.weebly.com/
http://efgdvdv.weebly.com/
http://sgr4wtrgf.weebly.com/
http://rt2g0g.weebly.com/
http://egwerfdgbv0.weebly.com/
http://wrhtfg.weebly.com/
http://grgfvb.weebly.com/
http://rdfbvegfb.weebly.com/
http://ardf1b0.weebly.com/
http://aerfgbth.weebly.com/
http://shb5trhg.weebly.com/
http://asrg54ty4h.weebly.com/
http://wegfrg.weebly.com/
http://wrehfgbn.weebly.com/
http://sfvb6fb.weebly.com/
http://sdgw4ergf.weebly.com/
http://sgbffb.weebly.com/
http://wrgfbb.weebly.com/
http://gew4refg.weebly.com/
http://fdsdfsdfrgrf.weebly.com/
http://atrh2h.weebly.com/
http://788netd.weebly.com/
http://manner8184.weebly.com/
http://sdgwedrfv.weebly.com/
http://shiboyulesd.weebly.com/
http://df84f1.weebly.com/
http://gfj2hj2.weebly.com/
http://agagds.weebly.com/
http://333www590.weebly.com/
http://33www7t789com.weebly.com/
http://wegdfbv.weebly.com/
http://egdsvbfbv.weebly.com/
http://rhgbn33.weebly.com/
http://playblockm.weebly.com/
http://wergfvbb.weebly.com/
http://ergfbb.weebly.com/
http://wrfdgvbn.weebly.com/
http://egwefb.weebly.com/
http://edsgbvfb.weebly.com/
http://sdd2f000cc.weebly.com/
http://w4etr2f.weebly.com/
http://dgf2jkn.weebly.com/
http://sd1v0dfv.weebly.com/
http://sdfghregbf.weebly.com/
http://sdgwrgfbv.weebly.com/