欢迎各位兄弟 发布技术文章
这里的技术是共享的
在Shell脚本中,你可以使用多种方法来判断一个字符串是否存在于一个数组(如whitelist
)中。下面我将提供几种不同的方式来实现这一点:
for
循环和条件语句bash深色版本#!/bin/bash
# 定义白名单数组
whitelist=("aaaa" "bbbb" "cccc" "dddd" "eeee")
# 要检查的字符串
str="aaaa"
# 判断字符串是否在数组中
in_array() {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 0; done
return 1
}
if in_array "$str" "${whitelist[@]}"; then
echo "字符串 '$str' 存在于白名单中。"
else
echo "字符串 '$str' 不在白名单中。"
fi
grep
和 printf
这种方法适用于更简单的场景,并且不需要定义额外的函数。
bash深色版本#!/bin/bash # 定义白名单数组 whitelist=("aaaa" "bbbb" "cccc" "dddd" "eeee") # 要检查的字符串 str="aaaa" # 将数组转换为字符串并使用 grep 检查 if printf '%s\n' "${whitelist[@]}" | grep -Fxq "$str"; then echo "字符串 '$str' 存在于白名单中。" else echo "字符串 '$str' 不在白名单中。" fi
case
语句(适合少量元素)对于较小的数组,可以考虑使用 case
语句来进行匹配:
bash深色版本#!/bin/bash # 要检查的字符串 str="aaaa" # 使用 case 语句检查 case "$str" in "aaaa"|"bbbb"|"cccc"|"dddd"|"eeee") echo "字符串 '$str' 存在于白名单中。" ;; *) echo "字符串 '$str' 不在白名单中。" ;; esac
[[ ... =~ ... ]]
正则表达式匹配这种方法可以让你在一个命令行中完成检查,但需要确保你的Shell支持正则表达式匹配(如 Bash 3.0+)。
bash深色版本#!/bin/bash # 定义白名单数组 whitelist=("aaaa" "bbbb" "cccc" "dddd" "eeee") # 要检查的字符串 str="aaaa" # 创建一个以空格分隔的字符串 whitelist_str="${whitelist[*]}" # 使用正则表达式匹配检查 if [[ " $whitelist_str " =~ " $str " ]]; then echo "字符串 '$str' 存在于白名单中。" else echo "字符串 '$str' 不在白名单中。" fi
以上所有方法都可以有效地检查给定的字符串是否存在于白名单数组中。选择哪种方法取决于你的具体需求和个人偏好。如果你需要处理较大的数据集或更复杂的逻辑,建议使用第一种方法(即定义一个函数),因为它提供了更好的可读性和维护性。
shell whitelist=("aaaa" "bbbb" "cccc" "dddd" "eeee") 判断 字符串 $str 在不在 whitelist 里面
要判断一个字符串 $str
是否在一个名为 whitelist
的数组中,可以使用 Bash 脚本编写一个简单的循环来检查。以下是示例脚本,演示了如何完成这个任务。
假设 whitelist
是一个包含多个字符串的数组,你需要验证 $str
是否在其中。
#!/bin/bash
# 定义白名单数组
whitelist=("aaaa" "bbbb" "cccc" "dddd" "eeee")
# 要检查的字符串
str="Luxshare-NST" # 可以修改这个字符串以测试其他值
# 初始化一个布尔变量,用于标识是否找到
found=false
# 遍历白名单数组
for item in "${whitelist[@]}"; do
if [[ "$item" == "$str" ]]; then
found=true
break
fi
done
# 检查找到的结果并输出
if $found; then
echo "'$str' is in the whitelist."
else
echo "'$str' is NOT in the whitelist."
fi
定义数组:使用 whitelist
数组定义一组字符串。
要检查的字符串:定义一个变量 str
,这是你想要检查的字符串。
初始化找到标识:定义一个布尔变量 found
,用于跟踪是否找到该字符串。
循环检查:
使用 for
循环遍历 whitelist
数组中的每个项。
使用 [[ "$item" == "$str" ]]
进行比较。
输出结果:最后,根据变量 found
的值来输出结果,指示 $str
是否在 whitelist
中。
将上述脚本保存为 .sh
文件,例如 check_whitelist.sh
,然后在终端中执行以下命令:
chmod +x check_whitelist.sh
./check_whitelist.sh
你可以修改 str
的值来测试不同的输入字符串。
printf '%s\n' "${whitelist[@]}" | grep -Fxq "$str"; 详解
这条命令是一个Shell脚本中常用的组合,用于检查一个字符串是否精确匹配(完全一致)数组中的任意元素。让我们逐个部分来解析这条命令:
bash深色版本printf '%s\n' "${whitelist[@]}" | grep -Fxq "$str"
printf
部分printf
: 这是一个内置的Shell命令,用于格式化输出。
'%s\n'
: 格式字符串,表示每个参数将被当作字符串(%s
)处理,并在每个字符串后面添加一个换行符(\n
)。这意味着每个数组元素都会被打印成单独的一行。
"${whitelist[@]}"
: 这是Shell语法的一部分,用来引用名为 whitelist
的数组的所有元素。@
符号会将数组展开为一系列独立的参数。
因此,printf '%s\n' "${whitelist[@]}"
会遍历 whitelist
数组,并将每个元素作为一行输出。
|
|
: 管道操作符,它将前一个命令的标准输出连接到后一个命令的标准输入。在这个例子中,printf
的输出将作为 grep
的输入。
grep
部分grep
: 这是一个强大的文本搜索工具,它会根据给定的模式查找文件或标准输入中的行。
-F
: 表示固定字符串模式匹配。这告诉 grep
不要解释模式中的任何特殊字符,只进行字面字符串匹配。
-x
: 表示全行匹配。这确保了只有当整行内容与模式完全匹配时才被视为匹配。
-q
: 安静模式。这会让 grep
不输出任何匹配结果,仅返回状态码。如果找到了匹配项,则退出状态为0;否则为1。
"$str"
: 这是要搜索的字符串,即你想要检查是否存在于 whitelist
数组中的那个字符串。
当你把所有这些部分放在一起时,printf '%s\n' "${whitelist[@]}" | grep -Fxq "$str"
的综合效果如下:
printf
将 whitelist
数组中的每个元素打印成一行。
管道 |
将这些行传递给 grep
。
grep
使用 -F
和 -x
选项对每一行进行严格的、完整的字符串匹配。
如果 grep
找到了一个完全匹配的行(即数组中的某个元素与 $str
完全相同),它不会输出任何内容(因为有 -q
选项),而是返回退出状态0。
如果没有找到匹配项,grep
返回退出状态1。
通常你会把这个命令放在 if
语句中,以便根据匹配的结果执行不同的代码路径:
bash深色版本if printf '%s\n' "${whitelist[@]}" | grep -Fxq "$str"; then echo "字符串 '$str' 存在于白名单中。" else echo "字符串 '$str' 不在白名单中。" fi
这里,if
语句会根据 grep
的退出状态来决定执行哪个分支。如果 grep
找到了匹配项(退出状态为0),则执行 then
后面的代码;如果没有找到匹配项(退出状态非0),则执行 else
后面的代码。
这种方法简单而高效,适用于需要检查字符串是否存在于列表中的场景。
printf '%s\n' 是把空格换成 换行吗
printf '%s\n'
的作用不仅仅是将空格替换为换行符,它的功能更为广泛和具体。它用于格式化输出字符串,并根据提供的格式说明符(%s\n
)对每个参数进行处理。让我们详细解释一下:
printf
命令printf
是一个非常灵活的命令,允许你以指定的格式打印文本或变量内容。它的基本语法如下:
bash深色版本printf FORMAT_STRING ARGUMENT...
FORMAT_STRING: 指定输出格式。
ARGUMENT...: 要格式化的参数列表。
%s\n
%s
: 表示一个字符串格式说明符。对于每个传递给 printf
的参数,它都会用这个参数的内容来替代 %s
。
\n
: 这是一个转义序列,表示换行符。每当 printf
处理完一个参数后,它会在输出中插入一个换行符。
printf '%s\n'
假设我们有一个数组 whitelist
,其中包含多个元素:
bash深色版本whitelist=("aaaa" "bbbb" "cccc")
当你执行以下命令时:
bash深色版本printf '%s\n' "${whitelist[@]}"
实际上发生了以下过程:
printf
遍历 whitelist
数组中的每个元素。
对于每个元素,printf
会按照格式说明符 %s\n
来格式化输出:
它将当前元素作为字符串输出(%s
)。
紧接着输出一个换行符(\n
)。
结果是每个数组元素被打印在单独的一行上。
如果运行上述命令,你会得到类似如下的输出:
深色版本aaaa bbbb cccc
不是简单的替换:printf '%s\n'
并不是简单地将空格替换成换行符。相反,它是根据提供的格式说明符逐个处理参数列表中的每一个项,并按照指定的方式输出它们。
适用于多个参数:它可以处理任意数量的参数,并且每个参数都按照相同的格式说明符来输出。
这种方法常用于将数组或列表中的每一项分行输出,方便后续处理,比如通过管道传递给其他命令(如 grep
),或者直接用于显示目的。
希望这能帮助你更好地理解 printf '%s\n'
的工作原理!如果你还有其他问题,请随时提问。