加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

别名、列表及数组 Linux shell

(2012-07-11 23:22:31)
标签:

linux

shell

it

别名
列表
数组:基本用法;特殊用法;用数组实现简单的数据结构
别名:
bash Shell的别名(aliases)可以为系统命令重新起一个名字
命令格式是:alias alias-name= 'original-command'
alias是指定别名命令的关键字
alias-name是用户所指定的别名(新名字)
original-command是所起别名所对应命令及其参数,当original-command是以空格分隔的字符串时,就要将original-command用引号括起来
等号两边是不能有空格的
删除已经设置的别名,可以使用unalias命令,unalias是一个内建命令,有如下两种格式:
unalias alias-name           #删除别名alias-name
unalias -a                        #删除所有别名
脚本中使用别名需要打开expand_aliases选项
shopt -s expand_aliases
alias命令不能在诸如if/then结构、循环和函数等混合型结构中使用

列表
列表由一串命令用与运算&&)和或运算||)连接而成,用与运算连接的列表称为与列表(and list),用或运算连接的列表称为或列表(or list)
命令1 && 命令2 && 命令3 && … && 命令n
上述格式的与列表从左至右依次执行命令,直到某命令返回FALSE时,与列表执行终止
演示andlist1.sh脚本:
#!/bin/bash

if [ -n "$1" ] && echo "The 1st argument=$1" && [ -n "$2" ] && echo "The 2nd argument=$2"
then
  echo "At least TWO arguments are passed to this script."
else
 echo "Less than TWO arguments are passed to this script."
fi
exit 0
命令1 || 命令2 || 命令3 || … || 命令n
或列表依然是从左至右依次执行命令,但是,它是当某命令返回TRUE时,或列表执行终止

数组的基本用法
数组(Array)是一个由若干同类型变量组成的集合,引用这些变量时可用同一名字。数组均由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素
bash Shell只支持一维数组,数组从0开始标号,以array[x]表示数组元素,那么,array[0]就表示array数组的第1个元素、array[1]表示array数组的第2个元素、array[x]表示array数组的第x+1个元素
bash Shell取得数组值(即引用一个数组元素)的命令格式是:
${array[x]}              #引用array数组标号为x的值
$符号后面的大括号必不可少
演示array_eval1.sh脚本:
#!/bin/bash

city[0]=Nanjing
city[1]=Beijing
city[9]=Melbourne
city[15]=NewYork

echo "city[0]=${city[0]}"
echo "city[1]=${city[1]}"
echo "city[9]=${city[9]}"
echo "city[15]=${city[15]}"
echo "city[2]=${city[2]}"
echo "city[10]=${city[10]}"

还可以用小括号将一组值赋给数组
演示array_eval2.sh脚本:
city=(Nanjing Beijing Melbourne NewYork)
演示array_eval3.sh脚本:
city=(Nanjing [10]=Atlanta Massachusetts Marseilles)
演示array_eval4.sh脚本:
city=([2]=Nanjing [10]=Atlanta [1]=Massachusetts [5]=Marseilles)
array[@]array[*]表示了array数组的所有元素
for i in ${city[@]}                #将@替换为*亦可
do
       echo $i
done
数组的特殊用法
数组的字符串操作
操作符号及其意义所介绍的字符串操作完全一致,数组字符串操作的特殊之处在于所有操作都是针对所有数组元素逐个进行的
演示string_array.sh脚本:
city=(Nanjing Atlanta Massachusetts Marseilles)
echo "Extracting Substring"
echo ${city[*]:0}
echo ${city[*]:1}
echo ${city[*]:3}
echo ${city[*]:0:2}  从编号为0 的开始 ,长度为2
echo
echo "Removing Substring"
echo ${city[*]#M*a}   //按最小长度删除
echo ${city[*]##M*a} //按最大长度删除
echo
echo "Replcing Substring"
echo ${city[*]/M*s/Year}
echo ${city[*]//M*s/Year
用read命令从stdin读取一系列的值
read -a array可以将读到的值存储到array数组
演示arrivedcity.sh脚本:
echo "What city have you been arrived?"
echo "The input should be separated from each other by a SPACE"
read -a arrivedcity
echo
for i in "${arrivedcity[@]}"
do
  echo "$i"
done

echo "The length of this array is ${#arrivedcity[@]}."
echo "Executing UNSET operation........."
unset arrivedcity[1]   //删除第2个城市
echo "The length of this array is ${#arrivedcity[@]}."
echo "Executing UNSET operation........."
unset arrivedcity   //删除所有的城市
echo "The length of this array is ${#arrivedcity[@]}."
数组连接
将多个数组合并到一个数组
演示combine_array.sh脚本:
city=(Beijing Nanjing Shanghai)
person=(Cai [5]=Wu Tang)

declare -a combine     //声明一个数组,其名为combine 
combine=(${city[@]} ${person[@]})
#combine=${city[@]}${person[@]}
element_count=${#combine[@]}
index=0
while [ "$index" -lt "$element_count" ]
do
   echo "Element[$index]=${combine[$index]}"
   let "index=$index+1"
done
echo
unset combine    //删除数组
combine[0]=${city[@]}
combine[1]=${person[@]}
element_count=${#combine[@]}
index=0
while [ "$index" -lt "$element_count" ]
do
   echo "Element[$index]=${combine[$index]}"
   let "index=$index+1"
done
echo
declare -a subcombine=${combine[1]}   //声明一个数组,其值为${combine[1]} 
element_count=${#subcombine[@]}
index=0
while [ "$index" -lt "$element_count" ]
do
   echo "Element[$index]=${subcombine[$index]}"
   let "index=$index+1"
done
用数组实现简单的数据结构
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,数据结构直接影响到程序的运行速度和存储效率
bash Shell不直接支持如堆栈、队列、链表等数据结构,但是,通过数组bash Shell可以很容易地实现线性数据结构
讲解用Shell数组实现堆栈结构
堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素
如果所有元素的类型相同,堆栈的存储也可以用数组来实现,访问操作可以通过函数接口提供
#stack.sh脚本:利用数组实现堆栈
#!/bin/bash
MAXTOP=50                        #堆栈所能存放元素的最大值
TOP=$MAXTOP    #定义栈顶指针,初始值是$MAXTOP
TEMP=                      
#定义一个临时全局变量,存放出栈元素,初始值为空
declare -a STACK                  #定义全局数组STACK
push函数是进栈操作,可以同时将多个元素压入堆栈
push()
{
if [ -z "$1" ]                        #若无任何参数输入,立即返回
then
   return
fi
 
#下面的until循环将push函数的所有参数都压入堆栈
until [ $# -eq 0 ]
do
let TOP=TOP-1                            #栈顶指针减1
STACK[$TOP]=$1                         #将第1个参数压入堆栈
shift                                    #脚本参数左移1位,$#减1
done
 
return
}
shift命令完成两个功能:
(1)所有位置参数左移1位,即$2移到$1的位置,$3移到$2的位置,依次类推
(2)$#变量值减1。依赖上述的shift命令的两个功能,下一次的until循环就可以对下一个位置参数进行处理,被处理的位置参数标号依然是$1
直到$#变量等于0时,所有位置参数处理完毕,until循环结束,push函数随之结束
#pop函数是出栈操作,执行pop函数使得栈顶元素出栈
pop()
{
TEMP=                                        #清空临时变量
 
if [ "$TOP" -eq "$MAXTOP" ]                #若堆栈为空,立即返回
then
 return
fi
 
TEMP=${STACK[$TOP]}                   #栈顶元素出栈
unset STACK[$TOP]
let TOP=TOP+1                            #栈顶指针加1
return
}







0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有