Linux设置字符串变量,Linux的数组、字符串处理以及变量赋值

数组:存储多个元素的连续的内存空间,相当于多个变量的集合

想要引用数组中的元素,需要数组名和索引号,索引号编号从0开始,属于数值索引。根据索引号的是否连续分为普通数组和关联属组

普通数组:索引号连续  (使用前可不声明)

关联属组:索引号可以不连续  ,也可是使用非整型的下表来索引属组中的元素。(使用前必须先声明)

声明属组:

declare -a ARRAY_NAME  普通数组

declare -A ARRAY_NAME: 关联数组

数组元素的赋值:

(1) 一次只赋值一个元素;

ARRAY_NAME[INDEX]=VALUE[root@localhost http2]# array[0]="red"

[root@localhost  http2]#  array[1]="blue"

[root@localhost http2]# array[2]="green"

[root@localhost http2]# array[3]="yellow"

(2) 一次赋值全部元素:[root@localhost http2]# arr=("one" "two" "three")

(3) 只赋值特定元素:

ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)[root@localhost http2]# arrc=([0]="shui" [4]="qi")

(4) 交互式数组值对赋值

read -a ARRAY[root@localhost http2]# read -a ARR

ni hao hello

引用数组

1、引用数组元素:${ARRAY_NAME[INDEX]}[root@localhost http2]# echo ${array[0]}

red

[root@localhost http2]# echo ${array[1]}

blue

[root@localhost http2]# echo ${array[2]}

green

[root@localhost http2]# echo ${array[*]}

red blue green yellow

[root@localhost http2]#

[root@localhost http2]# echo ${!array[*]} //显示数组array的索引

0 1 2 3

2、数组的长度(数组中元素的个数)

${#ARRAY_NAME[*]}

${#ARRAY_NAME[@]}[root@localhost http2]# echo ${#array[*]}

4

[root@localhost http2]# echo ${#array[@]}

4

[root@localhost http2]#

数组数据处理

1、引用数组中的元素:

所有元素:${ARRAY[@]}, ${ARRAY[*]}[root@localhost http2]# echo ${array[@]}

red blue green yellow

[root@localhost http2]# echo ${array[*]}

red blue green yellow

数组切片:${ARRAY[@]:offset:number}

offset: 要跳过的元素个数

number: 要取出的元素个数[root@localhost http2]# echo ${array[@]}

red blue green yellow

[root@localhost http2]# echo ${array[@]:2:1} //2表示跳过前两个元素,1表示取出一个元素

green

取偏移量之后的所有元素${ARRAY[@]:offset}[root@localhost http2]# echo ${array[@]}

red blue green yellow

[root@localhost http2]# echo ${array[@]:2} //表示跳过array属组中前两个元素,跳过前两个取出后面所有

green yellow

2、向数组中追加元素

ARRAY=("${ARRAY[@]}" "NEW")[root@localhost http2]# echo ${array[*]}    //添加元素之前

red green yellow bule

[root@localhost http2]# array=("${array[@]}" "white") //添加white元素

[root@localhost http2]# echo ${array[*]}

red green yellow bule white                //成功添加

[root@localhost http2]#

3、删除数组中的某元素:导致稀疏格式[root@localhost http2]# echo ${array[*]}  //算出元素之前

red green yellow bule white

[root@localhost http2]# unset array[2]   //删除索引号为2的元素

[root@localhost http2]# echo ${array[*]} //查看数组发现已经少了一个元素

red green bule white

[root@localhost http2]# echo ${!array[*]} //查看数组索引,2已经被删除!

0 1 3 4

关联数组:索引号可以不连续  ,也可是使用非整型的下表来索引属组中的元素。(使用前必须先声明)

declare -A ARRAY_NAME

ARRAY_NAME=([idx_name1]=('val1' [idx_name2]='val2‘...)[root@localhost http2]# declare -A A=([a]="abondan" [b]="banlance" [c]="curl")

[root@localhost http2]# echo ${A[*]} //查看关联数组A中的所有元素

abondan banlance curl

[root@localhost http2]# echo ${!A[*]} //查看关联属组的键值

a b c

[root@localhost http2]# echo ${#A[*]} //查看元素的个数

3

遍历一个关联数组可以用下面的方法:[root@localhost http2]# declare -A A=([a]="abondan" [b]="banlance" [c]="curl")

[root@localhost http2]# for i in `echo ${!A[*]}`;do echo $i : ${A[$i]};done

a : abondan

b : banlance

c : curl

字符串处理

1、字符串切片

1)${#var}:返回字符串变量var的长度[root@localhost http2]# var="helloworld"

[root@localhost http2]# echo ${#var}

10

2)${var:offset}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offset的取值在0 到${#var}-1 之间[root@localhost http2]# echo ${var}

helloworld

[root@localhost http2]# echo ${var:1}    //切下第一个字符

elloworld

[root@localhost http2]# echo ${var:5}    //切下前5个字符

world

3)${var:offset:number}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分[root@localhost http2]# echo ${var}

helloworld

[root@localhost http2]# echo ${var:5:3}    //切下前五个,然后取出来三个

wor

4)${var: -lengh}:取字符串的最右侧几个字符:

注意:冒号后必须有一空白字符[root@localhost http2]# echo ${var}

helloworld

[root@localhost http2]# echo ${var: -3}    //取后三个

rld

2、基于模式取子串:

1)${var#*word}:其中word可以是指定的任意字符

功能:自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字符串开头至第一次出现word字符之间的所有字符[root@localhost http2]# echo $var

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var#*root}

:x:0:0:root:/root:/bin/bash        //开头的root不见了

2)${var##*word}:同上,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容[root@localhost http2]# echo $var

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var##*root}

:/bin/bash            //删除到了最后出现root的地方

3)${var%word*}:其中word可以是指定的任意字符;

功能:自右而左,查找var变量所存储的字符串中,第一次出现的word, 删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;[root@localhost http2]# echo $var

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var%root*}

root:x:0:0:root:/            //自右而左删除至第一次出现root

4)${var%%word*}:同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符;[root@localhost http2]# echo $var

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var%%root*} //因为自右而左删除最后一个是root,所以全部删除

[root@localhost http2]# echo ${var%%o*}    //自右而左删除至最后一个o之间的包括o的所有内容

r

3、查找替换:

1)${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替换之[root@localhost http2]# echo $var

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var/r??t/shui}    //支持通配符,但是不支持正则表达式中的.

shui:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var//r..t/shui}

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var/root/shui}

shui:x:0:0:root:/root:/bin/bash            //开头第一个的root被shui替换掉了

2)${var//pattern/substi}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替换之[root@localhost http2]# echo $var

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var//root/shui}

shui:x:0:0:shui:/shui:/bin/bash        //所有出现root的地方全部被shui替换

3)${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substi替换之[root@localhost http2]# echo ${var}

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var/#root/shui}

shui:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var/#oo/shui}

root:x:0:0:root:/root:/bin/bash

4)${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替换之[root@localhost http2]# echo ${var}

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var/%a*h/shui}

root:x:0:0:root:/root:/bin/bshui        //以a*h结尾的字符串替换为shui

4、查找并删除

${var/pattern}:查找var所表示的字符串中,删除第一次被pattern所匹配到的字符串

${var//pattern}:所有

${var/#pattern}:首行

${var/%pattern}:行尾[root@localhost http2]# echo ${var/root}

:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var//root}

:x:0:0::/:/bin/bash

[root@localhost http2]# echo ${var/#r??t}

:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var/%a?h}

root:x:0:0:root:/root:/bin/b

5、字符大小写转换:

1)${var^^}:把var中的所有小写字母转换为大写[root@localhost http2]# echo $var

root:x:0:0:root:/root:/bin/bash

[root@localhost http2]# echo ${var^^}

ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

2)${var,,}:把var中的所有大写字母转换为小写[root@localhost http2]# echo ${VAR}

ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

[root@localhost http2]# echo ${VAR,,}

root:x:0:0:root:/root:/bin/bash

变量赋值

1)${var:-value}:如果var为空或未设置,那么返回value;否则,则返回var的值[root@localhost http2]# echo $var

[root@localhost http2]# echo ${var:-shui}

shui

2)${var:+value}:如果var不空,则返回value[root@localhost http2]# echo $var            //var之前没有设置

[root@localhost http2]# echo ${var:+shui}    //所以不操作

[root@localhost http2]# var=ab            //给var一个值

[root@localhost http2]# echo ${var:+shui}    //因为有值,所以返回shui

shui

3)${var:=value}:如果var为空或未设置,那么返回value,并将value赋值给var;否则,则返回var的值,之前两个虽然返回值,但是并没有赋值。[root@localhost http2]# unset var

[root@localhost http2]# echo ${var:=shui}

shui

[root@localhost http2]# echo $var        //已经将shui赋值给变量var

shui

4)${var:?error_info}:如果var为空或未设置,那么返回error_info;否则,则返回var的值[root@localhost http2]# unset var

[root@localhost http2]# echo ${var?no argue}

-bash: var: no argue        //显示一条错误信息

[root@localhost http2]# echo $var

shui

[root@localhost http2]# echo ${var:-no argue} //因为事先var有值,所以返回原来的值

shui

5)为脚本程序使用配置文件,实现变量赋值

(1) 定义文本文件,每行定义“name=value”

(2) 在脚本中source此文件即可[root@localhost newbin]# cat var    //var文件定义的变量内容

name1="li hua"

name2="xiao ming"

name3="jian pan"

[root@localhost newbin]# cat var.sh

#!/bin/bash

#function: test var

#author: xiaoshui

source var                        //调用var文件

echo $name1

echo $name2

echo $name3

[root@localhost newbin]# bash var.sh  //执行var.sh脚本

li hua

xiao ming

jian pan

间接变量引用

1、变量var1的内容为变量var2的变量名,变量var2有自己变量内容,通过var1引用var2的值就成为变量引用。

bash Shell提供了两种格式实现间接变量引用

eval    tempvar=\$$variable1

tempvar=${!variable1}[root@localhost newbin]# N1=N2

[root@localhost newbin]# N2=xiaoshui

[root@localhost newbin]# echo $N1        //使用普通的变量引用不会调用N2的值

N2

[root@localhost newbin]# echo ${!N1}    //通过间接变量引用来调用N2的值

xiaoshui

[root@localhost newbin]# eval N3=\$$N1 //使用eval时候需要使用新的变量来存储调用var2的值

[root@localhost newbin]# echo $N3

xiaoshui

2、eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。[root@localhost newbin]# echo $V1    //echo v1只显示变量内容

ls

[root@localhost newbin]# eval $V1    //eval 会扫描出命令,并且执行它

1               arrayvar_2.sh  disk.sh        forfiletype.sh  funcadduser.sh.bak  hostping2.sh  per.sh      sumnum.sh      testsrv.sh

2               arrayvar.sh    file1.sh       forrc3.d.sh     func.sh             hostping.sh   select.sh   sumspace.sh    testsrv.sh.bak

argsnum.sh      backup.sh      filetype.sh    func2.sh        functestsrv         links.sh      sum1_100    systeminfo.sh  var

arraymaopao.sh  checkint.sh    foraddn.sh     funcadduser     functestsrv.sh      login.sh      sumfile.sh  test           var.sh

array.sh        createuser.sh  foradduser.sh  funcadduser.sh  gid.sh              nologin.sh    sumid.sh    test2          yesorno.sh

[root@localhost newbin]# V1="pwd id"    //如果输入两条命令

[root@localhost newbin]# eval $V1        //eval只会执行第一条

/root/newbin

[root@localhost newbin]# V1="pwd; id"    //如果在命令中间加分号,两条都会执行

[root@localhost newbin]# eval $V1

/root/newbin

uid=0(root) gid=0(root) groups=0(root)

[root@localhost newbin]# V1="pwd;id;sdfasd"    //如果其中有一条不是命令,则会提示报错

[root@localhost newbin]# eval $V1

/root/newbin

uid=0(root) gid=0(root) groups=0(root)

-bash: sdfasd: command not found

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的连续赋值是指可以在一行代码中一次给多个变量赋值。在连续赋值中,赋值是从右到左进行的。具体来说: - 在引用中的例子中,通过连续值赋值可以将range(7)返回的列表中的值依次赋给变量MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY和SUNDAY。即MONDAY的值是0,TUESDAY的值是1,以此类推。 - 在引用中的例子中,连续赋值的语法可以用于链表节点的操作。通过list.next = ListNode(1)和list = ListNode(1)两个连续赋值语句,实现了将新的节点添加到链表中,并将list指向新添加的节点。 - 在引用中的例子中,连续赋值的语法也可以用于链表节点的操作。通过list.next = ListNode(1)和list = list.next两个连续赋值语句,实现了将新的节点添加到链表中,并将list指向新添加的节点。 总的来说,Python的连续赋值语法可以在一行代码中同时给多个变量赋值,方便快捷地进行多个变量赋值操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python中的连续赋值](https://blog.csdn.net/iteye_15479/article/details/81768006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python 学习笔记——连续赋值问题](https://blog.csdn.net/sinat_41445274/article/details/116589433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值