欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

shell 判断 某一个字符串在不在数组里面 通义 merlin chatgpt 有大用 有大大用

在Shell脚本中,你可以使用多种方法来判断一个字符串是否存在于一个数组(如whitelist)中。下面我将提供几种不同的方式来实现这一点:

方法1:使用 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

方法2:使用 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

方法3:使用 case 语句(适合少量元素)

对于较小的数组,可以考虑使用 case 语句来进行匹配:

bash
深色版本
#!/bin/bash

# 要检查的字符串
str="aaaa"

# 使用 case 语句检查
case "$str" in
  "aaaa"|"bbbb"|"cccc"|"dddd"|"eeee")
    echo "字符串 '$str' 存在于白名单中。"
    ;;
  *)
    echo "字符串 '$str' 不在白名单中。"
    ;;
esac

方法4:使用 [[ ... =~ ... ]] 正则表达式匹配

这种方法可以让你在一个命令行中完成检查,但需要确保你的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 是否在其中。

示例脚本

bash
#!/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

说明

  1. 定义数组:使用 whitelist 数组定义一组字符串。

  2. 要检查的字符串:定义一个变量 str,这是你想要检查的字符串。

  3. 初始化找到标识:定义一个布尔变量 found,用于跟踪是否找到该字符串。

  4. 循环检查

  • 使用 for 循环遍历 whitelist 数组中的每个项。

  • 使用 [[ "$item" == "$str" ]] 进行比较。

  • 输出结果:最后,根据变量 found 的值来输出结果,指示 $str 是否在 whitelist 中。

  • 使用方法

    将上述脚本保存为 .sh 文件,例如 check_whitelist.sh,然后在终端中执行以下命令:

    bash
    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" 的综合效果如下:

    1. printf 将 whitelist 数组中的每个元素打印成一行。

    2. 管道 | 将这些行传递给 grep

    3. grep 使用 -F 和 -x 选项对每一行进行严格的、完整的字符串匹配。

    4. 如果 grep 找到了一个完全匹配的行(即数组中的某个元素与 $str 完全相同),它不会输出任何内容(因为有 -q 选项),而是返回退出状态0。

    5. 如果没有找到匹配项,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[@]}"

    实际上发生了以下过程:

    1. printf 遍历 whitelist 数组中的每个元素。

    2. 对于每个元素,printf 会按照格式说明符 %s\n 来格式化输出:

    • 它将当前元素作为字符串输出(%s)。

    • 紧接着输出一个换行符(\n)。

  • 结果是每个数组元素被打印在单独的一行上。

  • 输出结果

    如果运行上述命令,你会得到类似如下的输出:

    深色版本
    aaaa
    bbbb
    cccc

    关键点

    • 不是简单的替换printf '%s\n' 并不是简单地将空格替换成换行符。相反,它是根据提供的格式说明符逐个处理参数列表中的每一个项,并按照指定的方式输出它们。

    • 适用于多个参数:它可以处理任意数量的参数,并且每个参数都按照相同的格式说明符来输出。

    实际应用

    这种方法常用于将数组或列表中的每一项分行输出,方便后续处理,比如通过管道传递给其他命令(如 grep),或者直接用于显示目的。

    希望这能帮助你更好地理解 printf '%s\n' 的工作原理!如果你还有其他问题,请随时提问。


    普通分类: