linux shell 数组建立及使用技巧
Linux shell在编程方面比windows 批处理强大太多,无论是在循环、运算。已经数据类型方面都是不能比较的。 下面是个人在使用时候,对它在数组方面一些操作进行的总结。
1.数组定义
[chengmo@centos5 ~]$ a=(1 2 3 4 5)
一对括号表示是数组,数组元素用“空格”符号分割开。
2.数组读取与赋值
3.特殊使用
从上面讲到的,大家可以发现linux shell 的数组已经很强大了,常见的操作已经绰绰有余了。
============== URL: http://snailwarrior.blog.51cto.com/680306/154704 BASH 数组用法小结
【小蜗牛五二无聊之作】
BASH只支持一维数组,但参数个数没有限制。
声明一个数组:
declare -a array (其实不用声明,按数组方式直接赋值给变量即可,BASH就知道那是数组)
数组赋值:
(1) array=(var1 var2 var3 ... varN) (2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN) (3) array[0]=var1 arrya[1]=var2 ... array[n]=varN 计算数组元素个数: ${#array[@]} 或者 ${#array[*]}
BASH的特殊参数 @ 和 * 都表示“扩展位置参数,从1开始”,但形式稍有差异,但在数组里使用好像是可以通用的。
引用数组:
echo ${array[n]}
遍历数组:
filename=(`ls`) for var in ${filename[@]};do echo $var done
数组实用示例:(个人收集整理)
1、从“标准输入”读入n次字符串,每次输入的字符串保存在数组array里
i=0
n=5 while [ "$i" -lt $n ] ; do echo "Please input strings ... `expr $i + 1`" read array[$i] b=${array[$i]} echo "$b" i=`expr $i + 1` done
2、将字符串里的字母逐个放入数组,并输出到“标准输出”
chars='abcdefghijklmnopqrstuvwxyz' for (( i=0; i<26; i++ )) ; do array[$i]=${chars:$i:1} echo ${array[$i]} done
这里有趣的地方是 ${chars:$i:1},表示从chars字符串的 $i 位置开始,获取 1 个字符。如果将 1 改为 3 ,就获取 3 个字符啦~ 结果是:
abc
bcd ... vxy xyz yz //没有足够字符串获取了 z //没有足够字符串获取了
3、将数组应用到shell环境变量
3、将数组应用到shell环境变量(1)
数组赋值:
[root@pps ~]# SEASON=("Srping" "Summer" "Autumn" "Winter")
当你发现赋值错了,也可以立刻从新赋值纠正,如上面的 Spring 被写成 Srping。
重新赋值:(原来的值被重写) [root@pps ~]# SEASON=("Spring" "Summer" "Autumn" "Winter")
查看一下环境变量:
[root@pps ~]# set | grep SEASON SEASON=([0]="Spring" [1]="Summer" [2]="Autumn" [3]="Winter")
显示整个数组:
[root@pps ~]# echo ${SEASON[*]} 或者 echo ${SEASON[@]} Spring Summer Autumn Winter
显示某一数组元素:
[root@pps ~]# echo ${SEASON[3]} Winter
给单个数组元素赋值:
[root@pps ~]# SEASON[0]="New_Spring"
再查看一下看数组:
[root@pps ~]# echo ${SEASON[*]} New_Spring Summer Autumn Winter
清除指定的单个数组元素:
[root@pps ~]# unset SEASON[2]
清除整个数组:
[root@pps ~]# unset SEASON
4、将数组应用到shell环境变量(2) 【这个用法不错!给原作者赞一个!】
使用tr命令将文件中的回车转换成空格:
[root@pps ~]# cat /etc/shells | tr "\n" " " > /tmp/tmp.file
将文件中内容给数组赋值:(碰到第一个回车符之前的内容)
[root@pps ~]# read -a SHELLS < /tmp/tmp.file
查看数组赋值情况:
[root@pps ~]# set | grep "SHELLS" SHELLS=([0]="/bin/sh" [1]="/bin/bash" [2]="/sbin/nologin" [3]="/bin/tcsh" [4]="/bin/csh" [5]="/bin/ksh")
后面可以将这个数组环境变量应用到其它的SHELL脚本或者应用程序里了~
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
=========== URL: http://justcoding.iteye.com/blog/1963463 linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。
一、判断读取字符串值 表达式 含义 加入了“*” 不是意思是: 当然, 如果变量var已经被设置的话, 那么其值就是$var.
二、字符串操作(长度,读取,替换) 表达式 含义 说明:"* $substring”可以是一个正则表达式.
实例:
读取:
Java代码
1,取得字符串长度
C代码
2,字符串所在位置
C代码
C代码
这个方法让我想起来了js的indexOf,各种语言对字符串的操作方法大方向都差不多,如果有语言基础的话,学习shell会很快的。
3,从字符串开头到子串的最大长度
C代码
个人觉得这个函数的用处不大,为什么要从开头开始呢。
4,字符串截取
C代码
C代码
上面的方法让我想起了,PHP的substr函数,后面截取的规则是一样的。
5,匹配显示内容
C代码
这里括号的用法,是不是根其他的括号用法有相似之处呢,
6,截取不匹配的内容
C代码
C代码
这里要注意,必须从字符串的第一个字符开始,或者从最后一个开始,可以这样记忆, 井号(#)通常用于表示一个数字,它是放在前面的;百分号(%)卸载数字的后面; 或者这样记忆,在键盘布局中,井号(#)总是位于百分号(%)的左边(即前面) 。
7,匹配并且替换
C代码
C代码
C代码
8. 比较
C代码
9. 连接
C代码
10. 字符串删除
Java代码
再加上一个参数处理的,URL如下: http://www.cnblogs.com/FrankTan/archive/2010/03/01/1634516.html
Bash Shell中命令行选项/参数处理
0.引言
./test.sh -f config.conf -v --prefix=/home
1. 手工处理方式
1 #!/bin/bash
2 3 for arg in "$*" 4 do 5 echo $arg 6 done 7 8 for arg in "$@" 9 do 10 echo $arg 11 done 12
#!/bin/bash
if [ x$1 != x ] then #...有参数 else then #...没有参数 fi
2. getopts/getopt
#test.sh
#!/bin/bash while getopts "a:bc" arg #选项后面的冒号表示该选项需要参数 do case $arg in a) echo "a's arg:$OPTARG" #参数存在$OPTARG中 ;; b) echo "b" ;; c) echo "c" ;; ?) #当有不认识的选项的时候arg为? echo "unkonw argument" exit 1 ;; esac done
#!/bin/bash # A small example program for using the new getopt(1) program. # This program will only work with bash(1) # An similar program using the tcsh(1) script language can be found # as parse.tcsh # Example input and output (from the bash prompt): # ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long " # Option a # Option c, no argument # Option c, argument `more' # Option b, argument ` very long ' # Remaining arguments: # --> `par1' # --> `another arg' # --> `wow!*\?' # Note that we use `"$@"' to let each command-line parameter expand to a # separate word. The quotes around `$@' are essential! # We need TEMP as the `eval set --' would nuke the return value of getopt. #-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项 #如-carg 而不能是-c arg #--long表示长选项 #"$@"在上面解释过 # -n:出错时的信息 # -- :举一个例子比较好理解: #我们要创建一个名字为 "-f"的目录你会怎么办? # mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用 # mkdir -- -f 这样-f就不会被作为选项。 TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \ -n 'example.bash' -- "$@"` if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi # Note the quotes around `$TEMP': they are essential! #set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了 eval set -- "$TEMP" #经过getopt的处理,下面处理具体选项。 while true ; do case "$1" in -a|--a-long) echo "Option a" ; shift ;; -b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;; -c|--c-long) # c has an optional argument. As we are in quoted mode, # an empty parameter will be generated if its optional # argument is not found. case "$2" in "") echo "Option c, no argument"; shift 2 ;; *) echo "Option c, argument \`$2'" ; shift 2 ;; esac ;; --) shift ; break ;; *) echo "Internal error!" ; exit 1 ;; esac done echo "Remaining arguments:" for arg do echo '--> '"\`$arg'" ; done
3.总结
一般小脚本手工处理也许就够了,getopts能处理绝大多数的情况,getopt较复杂,功能也更强大。
====== 还有一个,URL如下: http://hi.baidu.com/woailiuxiaomi/item/135490c486f6120b515058a0 linux shell:for循环遇到的空格问题
这问题以前就曾碰到,今天又遇上了,记录一下: 有一包含数行的文本文件1.txt,单词之间以空格隔开,如: [op@oradb ~]$ cat 1.txt a b c d e f g h i 需要对文件逐行处理,刚开如用for,如 for i in `cat 1.txt`;do echo $i|awk '{print "***",$0}';done 这时的输出如下: *** a *** b *** c *** d *** e *** f *** g *** h *** i
而不是所期望的-- *** a b c *** d e f *** g h i
解决方法: (1)用while read [op@oradb ~]$while read i; echo $i|awk '{print "***",$0}'; done<1.txt *** a b c *** d e f *** g h i
(2)更改IFS 将shell的IFS改成任意字符 [op@oradb ~]$ (IFS=':';for i in `cat 1.txt`;do echo $i|awk '{print "***",$0}';done) *** a b c *** d e f *** g h i (责任编辑:IT) |