case-substring 函数和引用

case-substring 函数和引用

我在脚本中使用一个简单的函数来检查字符串是否包含特定的子字符串:

#!/bin/bash 
#
subs() {
    case $2 in
         *$1*)
              return 0 ;;
         *)
              return 1 ;;
    esac
}

# example 1

res="$(grep -E '^blufoobla|^blubarbla' ~/test/file)"

subs foo "$res" || echo "blufoobla" >> ~/test/file
subs bar "$res" || echo "blubarbla" >> ~/test/file

# example 2

keym=us-whatever_foo

if subs - "$keym"; then
    echo there
else
    echo nope
fi

问题1:我可以吗必须$1在函数的 case 模式中引用? case 模式中未加引号的变量被解释为 glob。因此 - 我猜 - 在这种特殊情况下不需要引用变量。但我不确定...

问题2:我可以吗必须引用函数的第一个参数(subs foo "$res"subs "foo" "$res"/subs - "$keym"subs "-" "$keym"..?

我想避免过度引用。

答案1

我必须在函数的大小写模式中引用 $1 吗?

取决于,你想要它是一个模式还是一个硬字符串?

即,如果模式不加引号,则将匹配:

a='*.txt'
case file.txt in $a) echo match;; esac;

相反"$a"),它不会。

问题 2:我是否必须引用函数的第一个参数( subs foo "$res" 或 subs "foo" "$res" / subs - "$keym" 或 subs "-" "$keym"

你不到。如果你知道变量中的值不包含通配符或IFS字符,或者您知道您想要分词和通配符,那么当然,扩展周围不需要引号。

但是,如果输入来自未知来源,例如此处的输入文件,您可能希望 make 脚本工作,而不管什么数据确实如此。这需要引用这样的扩展。是的,这就是导致标准 shell 语言丑陋且难以使用的原因之一。 Zsh 在这方面更好。

不过,静态字符串-对于 shell 来说并不特殊,因此引用它不会执行任何操作,也不需要。

相关内容