0

我的代码出现以下错误。其中缺少什么?我的目标是在 $version 中打印 13.0.5.8

 #!/bin/ksh

 file="abc_def_APP_13.0.5.8"
  if echo "$file" | grep -E "abc_def_APP"; then
        echo "Version found: $file"

    version1=(echo $file |  awk -F_ '{print $NF}' | cut -d. -f1-3)

    version2=(echo $file | awk -F_ '{print $NF}' | cut -d. -f4-)

    echo $version1

    echo $version2

        version=$version$version2

        echo $version
 else
       echo "Version not found"
  fi

请在下面找到错误:

 ./version.sh: line 7: syntax error near unexpected token `|'
./version.sh: line 7: ` version1=(echo $file |  awk -F_ '{print $NF}' | cut -d. -f1-3)'
./version.sh: line 9: syntax error near unexpected token `|'
./version.sh: line 9: ` version2=(echo $file | awk -F_ '{print $NF}' | cut -d. -f4-)'



./version.sh: line 18: syntax error near unexpected token `else'
4

3 回答 3

1

问题是您的反引号丢失了$,您需要像这样修复以下两行:

version1=$(echo $file |  awk -F_ '{print $NF}' | cut -d. -f1-3)

version2=$(echo $file | awk -F_ '{print $NF}' | cut -d. -f4-)

这将修复语法错误。以下行没有多大意义,因为$version尚未初始化:

version=$version$version2

你的意思:

version="${version1}.${version2}"

附带说明您正在使用该-E选项,grep但您没有使用任何扩展的正则表达式功能,实际上您正在执行固定字符串字符串搜索,因此-F更合适。您可能还想使用该-q选项来抑制来自grep.

我个人会这样做:

file="abc_def_APP_13.0.5.8"

echo "$file" | awk '/abc_def_APP/{print "Version found: "$0;
                                  print $4,$5,$6;
                                  print $7;
                                  print $4,$5,$6,$7; 
                                  next}
                    {print "Version not found"}' FS='[_.]' OFS=.

如果您只想要变量中的版本号,version那么为什么不简单地:

version=$(echo "$file" | grep -o '[0-9].*')
于 2013-05-08T17:37:01.737 回答
1

根本不需要awk。只需修剪最后一个下划线之前的每个字符,如下所示:

file="abc_def_APP_13.0.5.8"
version="${file##*_}"
echo "$version"

有关此技术的文档,请参见http://mywiki.wooledge.org/BashFAQ/073,或参见 bash 自己的文档中的“参数扩展”。

单独处理最后一段也很简单:

file="abc_def_APP_13.0.5.8"
version="${file##*_}"          # result: 13.0.5.8
version_end="${version##*.}"   # result: 8
version_start="${version%.*}"  # result: 13.0.5
echo "${version_start}/${version_end}" # result: 13.0.5/8

因为这发生在 bash 内部,无需执行任何外部命令(例如 awk),它的执行速度应该比给定的其他方法快得多。

于 2013-05-08T17:44:23.303 回答
0

这一切都可以在一个 awk 命令中完成,无需额外的 cut 命令。考虑以下命令:

read version1 version2 < <(echo $file|awk -F "[_.]" '{
   printf("%s.%s.%s ", $4, $5, $6); printf("%s", $7);
   for (i=8; i<=NF; i++) printf(".%s", $i); print ""}')

echo "$version1 :: $version2"

输出

13.0.5 :: 8
于 2013-05-08T17:59:20.913 回答