Shell脚本:测试字符串是否包含字符(包括' *'和' \')等字符

时间:2016-06-17 18:45:03

标签: string bash shell sh

在shell脚本中,我有一个函数afun,它传递了一些参数。 我需要另一个函数来帮助我找出这些参数中是否至少有一个包含一个先验不知道的给定字符(但它可以是任何字符,如a9,{{1 }},*\|/(等等,但不是[):

space

建议的功能应该至少 Bash,Dash,Ash ZSH 兼容 - 因为我有一个需要运行的脚本在Docker容器中安装的不同Linux发行版(Ubuntu,Alpine Linux)下,我不想声明对特定shell解释器的依赖,因为并非所有这些容器都必须安装它。

2 个答案:

答案 0 :(得分:3)

这是我建议的shell函数:

charexists() {
  char="$1"; shift
  case "$*" in *"$char"*) return;; esac; return 1
}

以下是您可以使用它的方法:

afun() {
  # Some commands here...
  testchar=... # here I have some logic which decides what character should be tested below
  # Now, call another function to test if any of the args to "afun"
  # contain the character in var "testchar".
  # If it does, print "Found character '$testchar' !"
  charexists "$testchar" "$@" && echo "Found character '$testchar' !"
}

这是一个简单的单元测试:

fun2test=charexists
{ $fun2test '*' 'a*b' && printf 1 ;} ; \
{ $fun2test '*' 'a' '*' '\' 'b#c|+' '\' && printf 2 ;} ;\
{ $fun2test '\' 'a' '*' '\' 'b#c|+' '\' && printf 3 ;} ;\
{ $fun2test '*' 'ab' || printf 4 ;} ; \
{ $fun2test '*' 'a' '' '/' 'b#c|+' '\' || printf 5 ;}; echo

如果所有5个测试都通过,它应该打印12345

我刚刚在Bash,Dash,Ash和ZSH下测试过,一切顺利。

答案 1 :(得分:0)

以下是针对此的bash特定解决方案:

#!/bin/bash
fun()
{
  not_allowed=' ' # Charater which is not allowed
  [[ "$1" =~ $not_allowed ]] && echo "Character which is not allowed found"
}

fun "TestWithoutSpace"
fun "Test with space"