为 Bash 中的所有数组元素添加前缀

Raj*_*Rai 5 linux arrays bash shell

我将命令行参数存储在数组变量中。(这对我来说是必要的)。我想用通过变量传递的字符串作为所有数组值的前缀。

PREFIX="rajiv"

services=$( echo $* | tr -d '/' )

echo  "${services[@]/#/$PREFIX-}"
Run Code Online (Sandbox Code Playgroud)

我得到这个输出。

> ./script.sh webserver wistudio
rajiv-webserver wistudio
Run Code Online (Sandbox Code Playgroud)

但我期待这个输出。

rajiv-webserver rajiv-wistudio
Run Code Online (Sandbox Code Playgroud)

cod*_*ter 7

你的数组初始化是错误的。改成这样:

services=($(echo $* | tr -d '/'))
Run Code Online (Sandbox Code Playgroud)

如果没有外部(),services将成为一个字符串,并且参数扩展"${services[@]/#/$PREFIX-}"会添加$PREFIX-到您的字符串中。

在这种情况下,declare -p可用于检查变量的内容。在这种情况下,declare -p services应该向您展示:

declare -a services=([0]="webserver" [1]="wistudio") # it is an array!
Run Code Online (Sandbox Code Playgroud)

并不是

declare -- services="webserver wistudio"             # it is a plain string
Run Code Online (Sandbox Code Playgroud)

  • 由于分词和通配符扩展,`echo $*` 仍然存在许多潜在问题。我建议使用 `services=("${@//\//}")` 来创建数组,因为它可以正确处理参数中的几乎所有内容。 (2认同)