php 数组赋值-Shell编程基础(五)Shell字段与Subshel​​l

2023-08-23 0 4,830 百度已收录

贝壳领域

数组是数据的集合,数组中的每一位数据称为链表元素。 目前Bash仅支持一维索引数组和关联字段,并且Bash对链表的大小没有限制。

索引数组

定义索引字段的基本语句格式:

数组名[索引]=值

或者

数组名=(值1 值2 值3 ...)

数组定义:

[root@localhost shell]# a[0]=11
[root@localhost shell]# a[1]=22
[root@localhost shell]# a[2]="Hello"
[root@localhost shell]# a[3]="World"
[root@localhost shell]# b=("Shell" "Python" "PHP")

调用字段

${arrayname[index]}:返回一个数组元素 ${arrayname[*]}:作为一个整体返回字段的所有元素 ${arrayname[@]}:将字段的所有元素视为独立的 所有个体都返回 ${ #array name[*]} 或 ${#array name[@]}:返回数组元素的数量 ${!array name[*]} 或 ${!array name[@]}:返回数组的完整索引场地

数组调用:

[root@localhost shell]# echo ${a[0]}
11
[root@localhost shell]# echo ${a[2]}
Hello
[root@localhost shell]# echo ${a[*]}
11 22 Hello World
[root@localhost shell]# echo ${#a[*]}
4
[root@localhost shell]# echo ${!a[*]}
0 1 2 3

因为${数组名[@]}将所有字​​段元素视为独立个体,所以可以使用循环语句来遍历所有链表元素。

[root@localhost shell]# for i in "${a[@]}"
> do
> echo $i
> done
11
22
Hello
World

采用“数组名=(值1值2……)”的方法定义的字段与第一种形式的效果相同。 对于这种形式定义的字段,系统默认使用从0开始的有序数字作为索引。

[root@localhost shell]# for i in "${b[@]}"
> do
> echo $i
> done
Shell
Python
PHP
[root@localhost shell]# echo ${!b[*]}
0 1 2
[root@localhost shell]# echo ${b[*]}
Shell Python PHP
[root@localhost shell]#

关联数组

Bash 从 4.0 版本开始就支持关联字段。 使用关联字段,数组的下标可以是任何字符串。 关联字段的索引必须是唯一的。

定义关联字段的基本格式:

declare -A 数组名
数组名[key]=value

或者

declare -A 数组名
数组名=([key1]=值1 [key2]=值2 ...)

定义关联字段,必须使用“declare -A 数组名”来声明关联字段,其他句型与普通索引字段一致。 值得注意的是,索引数组很难转换为关联字段。

相关字段定义:

[root@localhost shell]# declare -A man
[root@localhost shell]# man[name]=Tom
[root@localhost shell]# man[age]=20
[root@localhost shell]# man[addr]="beijing"
[root@localhost shell]# man[phone]=13588888888
[root@localhost shell]# declare -A women
[root@localhost shell]# women=([name]=Lily [age]=18 [addr]=shanghai [phone]=18588888888)

调用读取关联字段:

[root@localhost shell]# echo ${man[name]}
Tom
[root@localhost shell]# echo ${#man[*]}
4
[root@localhost shell]# echo ${!man[@]}
name phone age addr
[root@localhost shell]# echo ${women[*]}
Lily 18588888888 18 shanghai

[root@localhost shell]# for i in ${!man[*]}; do echo "$i: ${man[$i]}"; done
name: Tom
phone: 13588888888
age: 20
addr: beijing
[root@localhost shell]#

子壳

由当前shell启动的新的子进程或子shell称为SubShell(子shell)。 子shell会手动继承父shell的很多环境,比如变量、工作目录、文件描述符等。相反,子shell中的环境只在子shell中有效,很难让父 shell 读取子 shell 的环境。

使用组命令符号 () 使命令在子 shell 中运行。 可以通过shell变量BASH_SUBSHELL查看子shell的数量。 该变量的初始值为0php 数组赋值,每次启动word shell时该变量的值都会手动加1。

[root@localhost subshell]# vim subshell01.sh
#!/bin/bash
# 功能描述:子Shell演示示例
# 父Shell
hi="parent shell"
echo "+++++++++++++"
echo -e "33[31m+ 父Shell +33[0m"
echo "+++++++++++++"
echo "PWD=$PWD"
echo "bash_subshell=$BASH_SUBSHELL"
# 通过()开启子Shell
(
sub_hi="subshell"
echo -e "t+++++++++++++"
echo -e "t33[33m+ 子Shell +33[0m"
echo -e "t+++++++++++++"
echo -e "tPWD=$PWD"
echo -e "tbash_subshell=$BASH_SUBSHELL"
echo -e "thi=$hi"
echo -e "tsubhi=$sub_hi"
cd /opt;echo -e "tPWD=$PWD"
)
# 返回父Shell
echo "+++++++++++++++++"
echo "+ 返回父Shell +"
echo "+++++++++++++++++"
echo "PWD=$PWD"
echo "hi=$hi"
echo "sub_hi=$sub_hi"
echo "bash_subshell=$BASH_SUBSHELL"
[root@localhost subshell]# chmod +x subshell01.sh
[root@localhost subshell]# ./subshell01.sh
+++++++++++++
+ 父Shell +
+++++++++++++
PWD=/opt/shell/subshell
bash_subshell=0
+++++++++++++
+ 子Shell +
+++++++++++++
PWD=/opt/shell/subshell
bash_subshell=1
hi=parent shell
subhi=subshell
PWD=/opt
+++++++++++++++++
+ 返回父Shell +
+++++++++++++++++
PWD=/opt/shell/subshell
hi=parent shell
sub_hi=
bash_subshell=0
[root@localhost subshell]#

脚本执行流程如下图所示:

另外,除了使用()启动子shell外,还可以使用&(将命令加载到后台执行)、| (管道符号)启动子 shell。 使用命令替换字符$()也会形成一个新的子shellphp 数组赋值,在shell脚本中执行外部命令也会启动一个新的子shell。

在以下示例中,使用换行符打开子 shell:

[root@localhost subshell]# vim subshell02.sh
#!/bin/bash
# 功能描述:使用管道符开启子Shell对程序的影响
sum=0
df | grep "^/" | while read name total used free other
do
echo "free=$free"
let sum+=free
echo "sum=$sum"
done
echo $sum
[root@localhost subshell]# chmod +x subshell02.sh
# 由于使用管道符|启动了子Shell,导致while循环中的所有命令都是在子Shell中执行的,sum在子Shell中进行的自加运算,在父Shell中无效,故最终输出的值为0。
[root@localhost subshell]# ./subshell02.sh
free=19079772
sum=19079772
0
[root@localhost subshell]#

那么如何解决上述管道字符启动器shell对程序的影响呢? 通过文件重定向的方式可以读取文件的形式,并且不会启动子shell。

[root@localhost subshell]# df | grep ^/ > df.txt
[root@localhost subshell]# vim subshell03.sh
#!/bin/bash
# 使用文件重定向,解决管道符启动子Shell对程序的影响问题
sum=0
while read name total used free other
do
let sum+=$free
done < df.txt
echo $sum
[root@localhost subshell]# chmod +x subshell03.sh
[root@localhost subshell]# ./subshell03.sh
19079780
[root@localhost subshell]#

在脚本中使用外部命令,包括加载其他脚本,也会打开一个word Shell,所以当需要在脚本中调用其他脚本时,必须使用source或者.load。

定义公共变量以在其他脚本中使用

[root@localhost subshell]# vim env.sh
#!/bin/bash
# 定义公共变量在其他脚本中使用
file="/etc/passwd"
password="T-have-a-dream"
error_info="Please try again later"
编写脚本执行外部命令或加载其他脚本
[root@localhost subshell]# vim subshell04.sh
#!/bin/bash
# 使用bash命令调用其他脚本
bash env.sh
echo "password=$password"
echo "Error:$error_info"
# 使用source调用其他脚本
source env.sh
echo "password=$password"
echo "Error:$error_info"
# 使用.调用其他脚本
. env.sh
echo "password=$password"
echo "Error:$error_info"
[root@localhost subshell]# chmod +x subshell04.sh
[root@localhost subshell]# ./subshell04.sh
password=
Error:
password=T-have-a-dream
Error:Please try again later
password=T-have-a-dream
Error:Please try again later

启动进程的方法

在Shell中执行命令创建进程的方式有:fork形式、exec形式、source形式。

叉形

通常,当系统中通过相对路径或绝对路径执行命令时,父进程会启动一个子进程,子进程结束后,子进程会返回到父进程。 这个行为过程称为fork。

当脚本中正常调用外部命令或者其他脚本时,会fork出一个子进程,我们的命令就会在这个shell中运行。

[root@localhost subshell]# vim subshell05.sh
#!/bin/bash
# 功能描述:fork子进程的示例
# 调用外部命令时会fork子进程
sleep 10
# 绝对路径或相对路径调用外部脚本时会fork子进程
/opt/shell/subshell/subshell02.sh
./subshell02.sh
[root@localhost subshell]# chmod +x subshell05.sh
[root@localhost subshell]# ./subshell05.sh
free=19079820
sum=19079820
0
free=19079820
sum=19079820
0

执行上述脚本的同时,打开一个新窗口并执行 pstree 命令来查看进程树。

脚本执行结束后返回父进程。

执行形式

当使用exec方法调用其他命令或脚本时,系统不会启动子进程,而是用新的程序替换当前的Shell环境。 因为当前的Shell环境被替换了,所以当exec调用的程序结束时,当前的环境也会被替换。 关闭。

Exec执行命令流程图:

[root@localhost subshell]# vim exec.sh
#!/bin/bash
# 使用exec方式调用外部命令
exec ls
echo "test"
cd /etc;echo $PWD
[root@localhost subshell]# chmod +x exec.sh
[root@localhost subshell]# ./exec.sh
df.txt env.sh exec.sh subshell01.sh subshell02.sh subshell03.sh subshell04.sh subshell05.sh
[root@localhost subshell]#

来源形式

使用源命令或 . (点)加载要在当前 shell 环境中执行的命令,而无需打开子 shell。 执行完加载的命令后,继续执行脚本中的后续指令。

[root@localhost subshell]# vim source.sh
#!/bin/bash
# 使用source加载外部脚本
source env.sh
echo "Error: $error_info"
ls /
[root@localhost subshell]# chmod +x source.sh
[root@localhost subshell]# ./source.sh
Error: Please try again later
bin boot data dev dvd etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@localhost subshell]#

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php 数组赋值-Shell编程基础(五)Shell字段与Subshel​​l https://www.wkzy.net/game/143553.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务