obeckham 发表于 2018-8-27 08:10:10

【shell基础】11、数组初步及字符串处理

  一、数组
  数组:是一种数据结构,
  数据序列,连续的多个数据,可以使用索引获取相关元素
  声明数组:
  declare -a ARRAYNAME# 可以不事先声明
  初始化赋值:
  ARRAYNAME=(“STRING1” "STRING2"...)   #使用空格隔开
  ARRAYNAME=("STRING1" ="STRING2"...)
  ARRAYNAME="STRING1" ARRYNAME="STRING3"
  获取数组中所有元素:${ARRARYNAME[@],${ARRAYNAME
[*]}
  获取数组中有效元素的总个数:${#ARRAYNAME[@]},${#ARRAYNAME
[*]}
  获取某一元素中字符串的长度:${#ARRAYNAME} (INDEX=0,1,2,3...)
  例:
# echo ${color}  
red
  
# echo ${color}
  
bule
  
# echo ${color}
  
gree
  
# echo $color
  
red
  
# echo $color         #数组不指定引用其第几个元素默认是引用第一个元素
  
red
  
# x=(nihao "s b" ='ruozhi')
  
# echo ${x}
  

  
# echo ${x}
  

  
# echo ${x}
  
s b
  
# echo ${x}
  
ruozhi
  
# x=(333 22 4444 555555555)
  
# echo ${#x}
  
2
  
# echo ${#x}
  
9
  传统数组和关联数组
  数组索引为数字的是传统数组
  数组索引为字符串的是关联数组
  在bash中传统数组可以不事先定义# declare -a,而关联数组必须事先定义# declare -A,awk中都可以不事先定义
# 传统数组  
# Test=(=a =c)
  
# echo $Test
  
a
  
# echo $Test
  
a
  
# echo ${Test}
  
c
  

  
# 关联数组
  
# Test1=(=AA =CC)
  
# echo $Test1
  
CC
  
# echo $Test1
  
CC
  
# echo ${Test1}
  
CC
  
# echo ${Test1}
  
CC
  

  
# declare -A Test2=(=AA =CC)
  

  
# echo ${Test2}
  
AA
  
# echo ${Test2}
  

  
# echo ${Test2}
  
CC
  
#
  二、bash伪随机数生成器
  $RANDOM
# echo $RANDOM  
4852
  
# echo $RANDOM
  
3161
  
# echo $RANDOM
  
23935
  
# echo $
  
26
  
# echo $
  
21
  
# echo $
  
16
  练习:
  1、打印九九乘法表
# cat 12.sh  
#!/bin/bash
  
n=('1' '2' '3' '4' '5' '6' '7' '8' '9')
  
for x in $(seq 0 8);do
  
    for y in $(seq 0 $x);do
  
      echo -e -n "${n}x${n}=$[${n}*${n}]\t"
  
      done
  
   echo
  
done
  

  
# bash 12.sh
  
1x1=1
  
1x2=2   2x2=4
  
1x3=3   2x3=6   3x3=9
  
1x4=4   2x4=8   3x4=124x4=16
  
1x5=5   2x5=103x5=154x5=205x5=25
  
1x6=6   2x6=123x6=184x6=245x6=306x6=36
  
1x7=7   2x7=143x7=214x7=285x7=356x7=427x7=49
  
1x8=8   2x8=163x8=244x8=325x8=406x8=487x8=568x8=64
  
1x9=9   2x9=183x9=274x9=365x9=456x9=547x9=638x9=729x9=81
  2、通过脚本生成N个随机数(N>5),对这些随机数按从小到大排序(冒泡排序)
  3、从所有同学们中挑选随机任意位
  三、字符串处理
  1、字符串切片
  ${#var}:
  返回字符串变量var的长度
  ${var:offset}:
  从最左侧跳过offset字符,返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值0 到${#var}-1 之间
  ${var: -offset}:
  取字符串的最右侧几个字符,使用空格或括号
  相当于自左而有跳过${#var} - n 个字符,返回后面的字符串
# name="xie xiao jun"  
# echo ${#name}
  
12
  
# echo ${name:4}
  
xiao jun
  
# echo ${name:-4}
  
xie xiao jun
  
# echo ${name:(-4)}
  
jun
  
# echo ${name: -5}
  
o jun
  ${var:offset:number}:
  返回字符串变量var 中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
  ${var: -offset:number}:
  返回字符串变量var 中从第${#var}-offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
  ${var:offset: -number}:
  从最左侧跳过offset 字符,一直取到字符串的最右侧number个字符之前(抛头去尾取中间)(bash4.2后才支持)
截取hello字符串:  
# VAR='hello world!'
  
# echo ${VAR:0:5}
  
hello
  
截取world字符串:
  
# echo ${VAR:5:-1}
  
world
  
截取最后一个字符:
  
# echo ${VAR:(-1)}    #使用空格隔开也可以
  
!
  ${#var}:
# name="xie jun"  
# arr1=(str1 str22 str333)
  
# echo $name
  
xie jun
  
# echo $arr1
  
str1
  
# echo $#name
  
0name
  
# echo ${#name}
  
7
  
# echo ${#arr1}      #数组返回的是第一个元素的长度
  
4
  ${var:offset}:
# echo ${name:0}    #从0开始  
xie jun
  
# echo ${name:1}
  
ie jun
  
# echo ${name:5}   #空格也算一个字符
  
un
  
# echo ${name:-5}
  
xie jun
  
# echo ${name: -5}#使用负值要使用空格,负值表示从右往左数
  
e jun
  
# echo ${arr1:1}
  
tr1
  
# echo ${arr1:1}
  
tr22
  ${var:offset:number}:
# echo ${name:1:1}  
i
  
# echo ${name:3:3}
  
ju
  
# echo ${name:3:10}
  
jun
  
# echo ${name:10:10}
  

  
# echo ${name:-1:10}    #没使用空格,无效
  
xie jun
  
# echo ${name: -1:10}
  
n
  
# echo ${name: -5:10}
  
e jun
  
  2、字符串截取
  ${var#*word}:其中word可以是指定的任意字符
  功能:
  自左而右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符之间的所有字符
  ${var##*word}:同上,
  不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容(即贪婪模式的删除)
# echo $name  
xie xiao jun
  
# echo ${name#s}
  
xie xiao jun
  
# echo ${name#*ia}
  
o jun
  
# echo ${name#*i}
  
e xiao jun
  
# echo ${name##*i}
  
ao jun
  ${var%word*}:其中word可以是指定的任意字符;
  功能:
  自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;
  ${var%%word*}:同上,
  只不过删除字符串最右侧的字符向左至最后一次出现word 字符之间的所有字符,(贪婪模式);
  注意:
  支持使用通配符,不支持正则表达式
# str="i very very love linux "  
# echo ${str#*e}
  
ry very love linux
  
# echo ${str##*e}
  
linux
  

  
# echo ${str%e*}
  
i very very lov
  
# echo ${str%%e*}
  
i v
  
  3、字符串查找替换
  ${var/pattern/substi}:
  查找var所表示的字符串中,第一次被pattern 所匹配到的字符串,以substi替换之
  ${var//pattern/substi}:
  查找var所表示的字符串中,所有能被pattern 所匹配到的字符串,以substi 替换之(全局替换)
  ${var/#pattern/substi}
  查找var 所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之
  ${var/%pattern/substi}
  查找var 所表示的字符串中,行尾被pattern 所匹配到的字符串,以substi 替换之
  ${var/pattern[/]}:查找var 所表示的字符串中,删除第一次pattern 所匹配到的字符串
  注意:
  支持使用通配符,不支持正则表达式
# echo ${str/e.y/sb}      #不支持正则表达式  
i very very love linux
  
# echo ${str/e?y/sb}      #支持通配符
  
i vsb very love linux
  
# echo ${str/ey/sb}
  
i vsb very love linux
  
# echo ${str//e?y/sb}
  
i vsb vsb love linux
  

  
# echo ${str/#i/sb}
  
sb very very love linux
  
# echo ${str/%i/sb}
  
i very very love linux
  
# echo ${str/%ux/sb}
  
i very very love linux
  
# echo ${str/%u/sb}
  
i very very love linux
  
# echo ${str/%x/sb}
  
i very very love linux
  
# echo ${str/%?/sb}
  
i very very love linuxsb
  

  
#查找删除(替换为空)
  
# str="i very very love linux"
  
# echo ${str/%linux}
  
i very very love
  
# echo ${str/%linux/}
  
i very very love
  
# echo ${str/i/}
  
very very love linux
  
# echo ${str/i v/}
  
ery very love linux
  
# echo ${str/i v}
  
ery very love linux
  
# echo ${str/v}
  
i ery very love linux
  
# echo ${str//v}
  
i ery ery loe linux
  
  4、字符大小写转换
  ${var^^}:把var 中的所有小写字母转换为大写
  ${var,,}:把var 中的所有大写字母转换为小写
# echo ${str^^}  
I VERY VERY LOVE LINUX
  
# echo ${str,,}
  
i very very love linux
  
  5、变量赋值
  ${var:-value}:如果var为空或未设置,那么返回value ;否则,返回var的值
  ${var:+value}:如果var不空,则返回value ,否则返回var的值即空值
  ${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则返回var的值
  ${var:?error_info}:如果var为空或未设置,那么在当前终端打印error_info;否则返回var的值
# echo $str  
i very very love linux
  
# echo $xj
  

  
# echo ${str:-xiejun}
  
i very very love linux
  
# echo ${xj:-xiejun}
  
xiejun
  
# echo ${str:xiejun}
  
i very very love linux
  
# echo ${str:+xiejun}
  
xiejun
  
# echo ${xj:xiejun}
  

  
# echo ${xj:+xiejun}
  

  
# echo ${str:=xiejun}
  
i very very love linux
  
# echo ${xj:=xiejun}
  
xiejun
  
# echo $xjj
  

  
# echo ${xjj:?xiejun}
  
-bash: xjj: xiejun
  
# echo $xjj


页: [1]
查看完整版本: 【shell基础】11、数组初步及字符串处理