我在脚本中使用一个简单的函数来检查字符串是否包含特定的子字符串:
#!/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 来说并不特殊,因此引用它不会执行任何操作,也不需要。