gpt4 book ai didi

linux - 如何在 Bash 中清理用户输入

转载 作者:太空宇宙 更新时间:2023-11-04 10:39:34 24 4
gpt4 key购买 nike

我正在用 bash 编写一个脚本,它会提示用户进行两个输入。这些输入分别分配给变量“TO_SCHEMA”和“FROM_SCHEMA”。

我需要一种方法来验证正确的输入。我的要求如下:

每个变量将有 3 个可接受的值。两个变量的值相同,但两个变量必须在这三个变量的列表中,并且它们不能是相同的值。

因此,如果值是“myco”、“myco_int”和“teambatch”,那么两个变量都必须是这些值之一,但它们不能相同。

${TO_SCHEMA} = myco && ${FROM_SCHEMA} = myco_int
Pass

${TO_SCHEMA} = myco_int && ${FROM_SCHEMA} = myco_int
Fail

${TO_SCHEMA} = mco && ${FROM_SCHEMA} = myco_int
Fail

${TO_SCHEMA} = myco && ${FROM_SCHEMA} = donkey
Fail

我怎样才能做到这一点?

我从一个充满 AND 和 OR 运算符的 if 语句开始,但它们很快就变得丑陋了。我在正则表达式方面的经验有限,而且我在 sed 和 awk 方面的经验是不存在的,但我愿意学习和尝试其中的任何一个。任何帮助将不胜感激。

编辑:

我还应该提一下,这个脚本只是为了一个有点小而乏味的临时任务,我必须在工作中做很多我想自动化的工作。如果我不是使用它的人,那么我团队中的某个人将会使用它。所以这种输入检查是需要的,而不是需要的。如果脚本因为错误的输入而中断,这并不是世界末日。我只是希望它能够更优雅地处理不良输入。

再次编辑:我感谢大家的建议,但我必须做一些澄清。这些值实际上不会是模式 1,2 和 3。出于安全原因,我不允许提供专有名称,但我正在将它们更改为更类似于真实值的值。

最佳答案

最简单的解决方案需要 bash 4.3。您只需将有效输入存储为关联数组的键,然后使用 -v 运算符检查给定输入是否定义为键。

declare -A valid
# Values don't matter, as long as the key exists.
# I put spaces in the keys just to show it's possible
valid[schema 1]=
valid[schema 2]=
valid[schema 3]=

if [[ $FROM_SCHEMA != $TO_SCHEMA && -v valid[$FROM_SCHEMA] && -v valid[$TO_SCHEMA] ]]; then
# inputs pass
else
# inputs fail
fi

在早期的 4.x 版本中,您可以稍微不同地检查关联数组中的未定义值。

declare -A valid
# Now, we need to make sure the values are non-null, but
# otherwise it doesn't matter what they are
valid[schema 1]=1
valid[schema 2]=1
valid[schema 3]=1
if [[ $FROM_SCHEMA != $TO_SCHEMA && -n ${valid[$FROM_SCHEMA]} && -n ${valid[$TO_SCHEMA]} ]]; then
# inputs pass
else
# inputs fail
fi

bash 4 之前,没有关联数组,您可以退回到扫描存储在常规数组中的有效输入列表。

valid=("schema 1" "schema 2" "schema 3")
if [[ $TO_SCHEMA == $FROM_SCHEMA ]]; then
# inputs fail
else
ok_count=0
# We've already established that TO and FROM are different,
# so only at most one per candidate can match.
for candidate in "${valid[@]}"; do
if [[ $TO_SCHEMA == $candidate || $FROM_SCHEMA == $candidate ]]; then
ok_count+=1
fi
done
if (( ok_count == 2 )); then
# inputs pass
else
# inputs fail
fi
fi

关于linux - 如何在 Bash 中清理用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35735469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com