【发布时间】:2020-11-29 09:53:33
【问题描述】:
我必须编写一个忽略变量中特定字符串的 bash 脚本,以防止文件混淆。我对 bash 很陌生,我不知道如何编写一行代码来检查非法变量/字符串组合。
例如,字符串marble 和igneous_rocks 决不能在for 循环中一起使用。这是需要更改的代码:
#!/bin/bash
IGNEOUS_BLOCK=(aa adakite pahoehoe)
METAMORPHIC_BLOCK=(eclogite marble)
SEDIMENTARY_BLOCK=(argillite chalk jaspillite)
ROCK_TYPE=(igneous_rocks metamorphic_rocks sedimentary_rocks)
#Buttons
for igneous_block in "${IGNEOUS_BLOCK[@]}" ; do
for rock_type in "${ROCK_TYPE[@]}" ; do
printf "{
\"parent\": \"block/button\",
\"textures\": {
\"texture\": \"strata:blocks/"$rock_type"/"$igneous_block"\"
}
}"> "${igneous_block}_button.json"
done;
done;
这是它应该做的:
如果变量ROCK_TYPE 使用字符串igneous_rocks,它应该只选择IGNEOUS_BLOCK 中的字符串,而不是来自METAMORPHIC_BLOCK 和SEDIMENTARY_BLOCK
这就是我希望所有变量都起作用的原因:
ROCK_TYPE 循环浏览可用的字符串。
ROCK_TYPE=(igneous_rocks metamorphic_rocks sedimentary_rocks)
应该只允许IGNEOUS_BLOCK 使用字符串igneous_rocks。
IGNEOUS_BLOCK=(aa adakite pahoehoe)
应该只允许METAMORPHIC_BLOCK 使用字符串metamorphic_rocks。
METAMORPHIC_BLOCK=(aa adakite pahoehoe)
SEDIMENTARY_BLOCK 应该只允许使用字符串sedimentary_rocks。
SEDIMENTARY_BLOCK=(aa adakite pahoehoe)
需要对我的代码进行哪些更改才能使其按我想要的方式工作?
【问题讨论】:
-
两个
for和do但只有一个done?添加一个shebang,然后将您的脚本粘贴到那里:shellcheck.net -
我将代码更改为有两个
done而不是一个,并在顶部添加了一个 shebang,但我仍然最终将 'sedimentary_rocks` 与 'aa' 一起使用。我该如何解决? -
继续通过 ShellCheck。 shebang 不应该缩进,双引号是错误的。但这似乎不是问题。
-
在 bash 中执行代码似乎完全没问题。 ShellCheck 只推荐替代方案来编写代码。文件确实按应有的方式生成,但在代码中使用的字符串的顺序是错误的。此外,双引号可以以多种方式使用。我还发现您可以将大部分代码用双引号或单引号括起来。
-
是的,我问,为什么变量没有命名为
igneous_rocks=(aa adakite pahoehoe),而是一些随机的IGNEOUS_BLOCK?您为什么要将igneous_rocks转换为IGNEOUS_BLOCK?为什么不首先将变量命名为igneous_rocks?
标签: string bash for-loop variables