如何分离列表中的不同数据值并将其分配给 shell 脚本中的变量?

如何分离列表中的不同数据值并将其分配给 shell 脚本中的变量?

假设我在 shell 脚本中有一个数据列表像这样:

DataList = ["
Cat
Dog
Rabbit
GuineaPig
Hamster
"]

现在,我该如何将列表中的每个单独的数据值设置为变量? 像这样:

$Value0 = "Cat"
$Valu1 = "Dog"
$Value2 = "Rabbit"
$Value3 = "GuineaPig"
$Value4 = "Hamster"

顺便说一下,我熟悉 Grep、AWK 和 SED 等命令行实用程序。但是,我不太确定从哪里开始做这样的事情。

另外,顺便说一下,我首选的 shell 是 Fish,不过您也可以使用 BASH 或 SH 格式回答。不用担心,我可以翻译。

答案1

不确定您需要什么。这有帮助吗?

#!/bin/bash
DataList=(
Cat
Dog
Rabbit
GuineaPig
Hamster
)

for i in {0..4}
do
    value[$i]=${DataList[$i]}
    echo "value[$i] = ${value[$i]}"
done

输出:

value[0] = Cat
value[1] = Dog
value[2] = Rabbit
value[3] = GuineaPig
value[4] = Hamster

答案2

由于您首选的 shell 是 Fish,我将提供三个选项。

首先,给定DataList字符串格式,您可以使用string split将各行拆分为实际列表:

> set DataList "
  Cat
  Dog
  Rabbit
  GuineaPig
  Hamster
  "

> set --show DataList

$DataList: set in global scope, unexported, with 1 elements
$DataList[1]: |\nCat\nDog\nRabbit\nGuineaPig\nHamster\n|

> set Value (string split -n \n "$DataList")
> set --show Value

$Value: set in global scope, unexported, with 5 elements
$Value[1]: |Cat|
$Value[2]: |Dog|
$Value[3]: |Rabbit|
$Value[4]: |GuineaPig|
$Value[5]: |Hamster|

> echo $Value[2]

Dog

^示例中的空行纯粹是为了方便阅读,不会出现在实际输出中

但是如果可以的话,只需将数据作为列表文字嵌入到脚本中并避免额外的string split

> set DataList "Cat" \
  "Dog" \
  "Rabbit" \
  "GuineaPig" \
  "Hamster"

> set --show DataList

$DataList: set in global scope, unexported, with 5 elements
$DataList[1]: |Cat|
$DataList[2]: |Dog|
$DataList[3]: |Rabbit|
$DataList[4]: |GuineaPig|
$DataList[5]: |Hamster|

> echo $DataList[2]
Dog

最后,从字面上理解,你的问题是将列表分成变量,而不是包含列表的变量。我认为这不是真的你的意思。在我看来,这有点病态,因为你将失去轻松计算、迭代和索引结果的能力,但它做完了 ...

set DataList "
Cat
Dog
Rabbit
GuineaPig
Hamster
"

set v (string split -n \n "$DataList")

set scrpt (for i in (seq (count $v))
             echo 'set Value'(math $i-1) '"'$v[$i]'"'
           end)

eval (string join ";" $scrpt)
set --erase v
set --erase scrpt

结果是:

$Value0 = "Cat"
$Value1 = "Dog"
$Value2 = "Rabbit"
$Value3 = "GuineaPig"
$Value4 = "Hamster"

答案3

我会将值保存在以冒号分隔的列表中,并使用 Stephen Collyer 的“Bash Path Functions”或cut -d: -f3类似函数。

这是我预先写好的 blob:

我使用 Stephen Collyer 的 bash_path_funcs,早在 2000 年的 Linux Journal 中就有描述:

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/376​​8 https://www.linuxjournal.com/article/3935

addpath函数仅当路径中不存在条目时才向路径添加条目。delpath -n从路径中删除所有不存在的目录。

您可以pathfunc.tgzhttps://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

相关内容