3

考虑以下代码:

a=(1 2 3)
a='seven'

export a
declare -p a

输出(来自declare)是:

declare -ax a='([0]="seven" [1]="2" [2]="3")'

a数组也是如此。问题:

  1. 如何更改第二行,a不再是一个数组,而是一个带有值的简单变量seven?我正在寻找一个单线,没有unset等。
  2. 将变量分配给数组只会替换第一个元素,而不是整个数组。此行为在哪里指定?

注意:Bash v. 3.2.48 (OS X)。

(我今天已经回答了这个问题,这让我想到了这个问题,我正在寻找一个更清洁的解决方案)。


编辑:我正在寻找:

a=(1 2 3)

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

export a
declare -p a

但没有做明确unset的 . 在特殊情况下,a它实际上是一个PATH变量(参见这个问题)。

4

2 回答 2

2
于 2013-09-02T10:26:00.283 回答
1

您可以只使用第一个值:

a=${a[0]}

or

a=$a

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

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

b=a; unset a; a=$b
export a

或者你可以做单行:

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

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

注意:后者使用eval不当会很危险,所以你必须小心使用它。

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

{ unset a; IFS= read -rd '' a; } < <(echo -n "$a")
export a

事实证明,首先将变量的值保存到另一个,取消设置并重新分配它仍然是最好的方法。

于 2013-09-02T09:54:55.743 回答