首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将单个变量赋值给数组(就位)

将单个变量赋值给数组(就位)
EN

Stack Overflow用户
提问于 2013-09-02 09:54:02
回答 2查看 245关注 0票数 3

考虑以下代码:

代码语言:javascript
运行
复制
a=(1 2 3)
a='seven'

export a
declare -p a

输出(来自declare)是:

代码语言:javascript
运行
复制
declare -ax a='([0]="seven" [1]="2" [2]="3")'

所以a是一个数组。问题:

  1. 如何更改第二行,使a不再是数组,而是一个具有seven值的简单变量?我在找一条没有unset等的单线。
  2. 将变量分配给数组只替换第一个元素,而不是整个数组。这种行为在哪里具体说明呢?

注: Bash诉3.2.48 (OS X)。

(我今天回答了这个问题,这让我思考了这个问题,我正在寻找一个更干净的解决方案)。

编辑:,我在找一个:

代码语言:javascript
运行
复制
a=(1 2 3)

/* One line here please :) */
unset a
a='seven'

export a
declare -p a

但是不做显式的unset。当a实际上是一个PATH变量时,它在特殊情况下很重要(参见问题)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-02 10:26:00

您需要使用unset

“手册”的第一句引文(下文)将解释如下:

代码语言:javascript
运行
复制
a='seven'

a是一个数组时,是否与之前的相同:

代码语言:javascript
运行
复制
a[0]='seven'

引用手册的话

当为索引数组赋值时,如果提供了可选下标,则将该索引分配给该索引;否则,分配的元素的索引将是语句加一个分配给的最后一个索引。索引从零开始。

unset内置器用于破坏数组。unset名称包脚本在索引下标处销毁数组元素。必须注意避免文件名扩展所造成的不必要的副作用。unset名称(其中的名称是数组)移除整个数组。‘*’‘@’的下标也会删除整个数组。

票数 2
EN

Stack Overflow用户

发布于 2013-09-02 09:54:55

您可以只使用第一个值:

代码语言:javascript
运行
复制
a=${a[0]}

or

a=$a

因为在数组中,如果没有提供下标,它的默认值是它的第一个元素值。

如果要导出变量,则需要防止它成为数组。您可以先将它保存在变量上,然后取消设置并重置它,如下所示:

代码语言:javascript
运行
复制
b=a; unset a; a=$b
export a

或者你可以做一条线:

代码语言:javascript
运行
复制
{ unset a; IFS= read -r a; } <<< "$a"
export a

eval "unset a; IFS= read -r a" <<< "$a"
export a

注意:后者使用eval,如果使用不当,这是危险的,所以您必须小心使用它。

更新:<<< ""似乎在值的末尾追加了一个换行符,所以我们不能使用read -rd ''来包含分隔它的行。但是,我们可以使用进程替换:

代码语言:javascript
运行
复制
{ unset a; IFS= read -rd '' a; } < <(echo -n "$a")
export a

原来,首先将变量的值保存到另一个变量,取消它并重新分配它仍然是最好的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18570308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档