如何使用 bash 查找长度或检查方括号中的字符串列表是否为空?
How to find the length or check if a list of strings in a square bracket is empty using bash?
我有这样的东西
VIEWERS=[]
EDITORS=[]
ADMINS='["abc@email.com","xyz@email.com"]'
然后将其作为列表传递给 .yaml 文件
我想添加一个检查以确保是否设置了三个中的 none 然后终止并且不要继续
但是我无法弄清楚如何通过 bash 检查此类字符串的列表是否为空。
什么是正确的语法。由于 .yaml 限制,我不能对这些使用圆括号
这里有两个问题。看起来你想要定义数组。
这样做是这样的:
VIEWERS=() or VIEWERS=(abc@email.com)
一旦它们被定义,你可以像这样检查所有这些数组是否为空:
VIEWERS=()
EDITORS=()
#ADMINS=()
ADMINS=(abc@email.com bcd@email.com)
if [ ${#VIEWERS[@]} -eq 0 ] && [ ${#EDITORS[@]} -eq 0 ] && [ ${#ADMINS[@]} -eq 0 ] ; then
echo "all empty arrays"
else
echo "non-empty array"
fi
如果你 运行 以上,你将得到:非空数组,因为 ADMINS 不为空。
但是,如果您注释掉第 2 行 ADMINS 并取消注释第 1 行 ADMINS,您将得到:所有空数组。
希望对您有所帮助。
不,我不想使用圆括号,因为我必须将它作为方括号内的内容进一步传递给我的 kubernetes 部署
有什么方法可以使用这种格式吗?
ADMINS='[]'
这应该是将它们与字符串“[]”进行比较的简单问题。请注意,由于任何包含 [
和 ]
的内容看起来都像是 shell 的文件名通配符表达式,因此您需要使用适当的引号来防止 "helpfully" 将它们转换为列表匹配的文件名。这意味着变量引用周围有双引号,文字周围可能有单引号。此外,我建议使用小写或混合大小写的变量名,以避免与许多具有特殊 meanings/functions 的全大写名称发生冲突。所以像这样:
viewers='[]'
editors='[]'
admins='["abc@email.com","xyz@email.com"]'
if [ "$viewers" = '[]' ] && [ "$editors" = '[]' ] && [ "$admins" = '[]' ]; then
echo "They're all empty"
else
echo "At least one array has contents"
fi
我会这样尝试:
cat infile | cut -d"]" -f1 | cut -d"[" -f2 | sed -e /^$/d
(*注意:我不在乎,为了便于阅读,我有时喜欢从 cat 开始。)
首先我们用 cat 提供输入,然后在分隔符 ']' 之前剪切字段,然后在 '[' 之后剪切剩余的位。最后,我们放入 sed 行以删除由剪切操作的空结果返回的空行。
*编辑:
在此处的线程中扫描您孤立的评论后...似乎您可能想要保留括号。将来显示您想要的输出恕我直言会很有帮助。也许这行得通吗?
cat infile| cut -d"=" -f2 | sed 's/[[]]//g' | sed -e /^$/d
首先,我们读入文件...然后在“=”之后剪切 for,然后使用 sed,删除所有带空括号的结果。最后是另一个 sed 从结果中删除空行。
我有这样的东西
VIEWERS=[]
EDITORS=[]
ADMINS='["abc@email.com","xyz@email.com"]'
然后将其作为列表传递给 .yaml 文件 我想添加一个检查以确保是否设置了三个中的 none 然后终止并且不要继续
但是我无法弄清楚如何通过 bash 检查此类字符串的列表是否为空。 什么是正确的语法。由于 .yaml 限制,我不能对这些使用圆括号
这里有两个问题。看起来你想要定义数组。 这样做是这样的:
VIEWERS=() or VIEWERS=(abc@email.com)
一旦它们被定义,你可以像这样检查所有这些数组是否为空:
VIEWERS=()
EDITORS=()
#ADMINS=()
ADMINS=(abc@email.com bcd@email.com)
if [ ${#VIEWERS[@]} -eq 0 ] && [ ${#EDITORS[@]} -eq 0 ] && [ ${#ADMINS[@]} -eq 0 ] ; then
echo "all empty arrays"
else
echo "non-empty array"
fi
如果你 运行 以上,你将得到:非空数组,因为 ADMINS 不为空。
但是,如果您注释掉第 2 行 ADMINS 并取消注释第 1 行 ADMINS,您将得到:所有空数组。
希望对您有所帮助。
不,我不想使用圆括号,因为我必须将它作为方括号内的内容进一步传递给我的 kubernetes 部署 有什么方法可以使用这种格式吗?
ADMINS='[]'
这应该是将它们与字符串“[]”进行比较的简单问题。请注意,由于任何包含 [
和 ]
的内容看起来都像是 shell 的文件名通配符表达式,因此您需要使用适当的引号来防止 "helpfully" 将它们转换为列表匹配的文件名。这意味着变量引用周围有双引号,文字周围可能有单引号。此外,我建议使用小写或混合大小写的变量名,以避免与许多具有特殊 meanings/functions 的全大写名称发生冲突。所以像这样:
viewers='[]'
editors='[]'
admins='["abc@email.com","xyz@email.com"]'
if [ "$viewers" = '[]' ] && [ "$editors" = '[]' ] && [ "$admins" = '[]' ]; then
echo "They're all empty"
else
echo "At least one array has contents"
fi
我会这样尝试:
cat infile | cut -d"]" -f1 | cut -d"[" -f2 | sed -e /^$/d
(*注意:我不在乎,为了便于阅读,我有时喜欢从 cat 开始。)
首先我们用 cat 提供输入,然后在分隔符 ']' 之前剪切字段,然后在 '[' 之后剪切剩余的位。最后,我们放入 sed 行以删除由剪切操作的空结果返回的空行。
*编辑:
在此处的线程中扫描您孤立的评论后...似乎您可能想要保留括号。将来显示您想要的输出恕我直言会很有帮助。也许这行得通吗?
cat infile| cut -d"=" -f2 | sed 's/[[]]//g' | sed -e /^$/d
首先,我们读入文件...然后在“=”之后剪切 for,然后使用 sed,删除所有带空括号的结果。最后是另一个 sed 从结果中删除空行。