在shell中查找并匹配模式

时间:2016-01-17 17:46:49

标签: shell

我有以下代码在远程服务器上运行:

z=`echo $r| sed 's/\\$//g'`
server=`echo $z | awk '{print tolower($0)".outsourcing.com"}'`

如果我将$ r值作为'SCALE'传递,我希望我的server变量找到比例为'-scale'表示如果server变量找到任何后缀或前缀,它应该给出输出。假设我将SCALE传递给$ r并找到primary-scale.outsourcing.com,它应该将输出提供为:

echo $server 

primary-scale.outsorcing.com

此条件也适用于SCALE。意味着如果我在$ r变量中传递任何其他字符串,它不应该影响我上面的现有代码。请帮我把它放在这里。

1 个答案:

答案 0 :(得分:1)

# translate to lower-case earlier, not later
r=$(printf '%s\n' "$r" | tr '[:upper:]' '[:lower:]')

# substitute scale with -scale, leave other values alone
[ "$r" = "scale" ] && r="-scale"

# original, unmodified code
z=`echo $r| sed 's/\\$//g'`
server="$z.outsourcing.com"

那就是说,我可以考虑改变这个:

#!/bin/bash
#      ^^ must be bash shebang; must be bash 4.0 or newer for built-in lowercase PE

r=${r,,} # make value lower-case, for bash 4.0+
# for older shells: use z=$(printf '%s' "$z" | tr '[:upper:]' '[:lower:]') instead of above

[[ $r = scale ]] && r=-scale
z=${r//"$"/}

server="$z.outsourcing.com"

由于新代码不包含对外部工具(awk,sed等)的调用,因此运行速度会快得多。

最后 - 如果您真正想要的是查找前缀或前缀值的文件(然后最终以outsourcing.com结尾),那么您的server=行是错误的,我的将该行翻译成现代语法。请考虑以下内容:

set -- *"$z"*.outsourcing.com
for server; do
  [ -e "$server" ] && echo "$server"
done