假设我在 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/3768 https://www.linuxjournal.com/article/3935
此addpath
函数仅当路径中不存在条目时才向路径添加条目。delpath -n
从路径中删除所有不存在的目录。
您可以pathfunc.tgz
从 https://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz