【问题标题】:Shell script substring extraction and manipulationShell 脚本子字符串提取和操作
【发布时间】:2016-04-12 07:36:35
【问题描述】:

我能够从一个字符串中提取一个子字符串;但是无论我尝试什么语法更改(并且我已经尝试了很多),我都无法在此 sn-p 中实际输入 if 块,即使打印输出表明 CLIENT_NAME 字符串与预期匹配(附加第一个echo的输出)。只有第一个 echo 打印任何内容。我在这里做错了什么?任何想法都非常感谢!

这个想法是如果客户端被命名为aa_NNNN,那么我需要提取aaNNNN 并检查aa 是否与已知字符串匹配(比如“xx”)和如果确实如此,则仅计算版本NNNN 并在版本NNNN 超过已知版本MMMM 时执行某些操作。

#! /bin/sh
CLIENT=$1
...
CLIENT_NAME="${CLIENT:0:2}"
CLIENT_VERSION=2015
echo "Before compare; client: $CLIENT_NAME; version: $CLIENT_VERSION"
if [ "$CLIENT_NAME" == "xx" ]; then
   CLIENT_VERSION="${CLIENT:3:4}"
   echo "Inside compare; client: $CLIENT_NAME; version: $CLIENT_VERSION"
   if [ $CLIENT_VERSION -ge 2016 ]; then
      ...
   fi
fi

第一个回显输出:

Before compare; client: xx; version: 2015

/bin/sh --version 返回:

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

【问题讨论】:

  • 我试过你的代码,它工作。您是否正在使用您压制的代码中的 var CLIENT 做某事?
  • @anubhava:这是脚本的命令行参数输入。我知道 CLIENT 得到了正确的输入。准确地说,这种情况下的 $1 是 xx_2016
  • @tiagohngl:哇哦..在那些被压制的行里什么都没有。所以你有内部回声也打印?太疯狂了!
  • 好吧,像 script.sh xx_2016 这样执行脚本适用于第一个 if。最后,如果您必须将, 替换为:
  • 您的输出与脚本中的echo 语句不太匹配。你能解决这个问题吗?

标签: linux bash shell unix


【解决方案1】:

我在运行您的代码时得到了相同的结果,但是从子字符串提取中删除了引号(并在第二个中将, 替换为:)修复了它...

CLIENT_NAME=${CLIENT:0:2}

...和...

CLIENT_VERSION=${CLIENT:3:4}

【讨论】:

  • 谢谢@Patrick:你有像@tiagohngl 一样的/bin/bash 吗?我尝试了您的更改,但仍然没有为我打印第二个回声。
  • 我在一台装有 GNU Bash 3.2.57 的 Mac 上。编辑后的脚本适用于 /bin/bash/bin/sh。我还在 Ubuntu 14.04 上使用 Bash (/bin/bash) 成功测试。
  • 您是否尝试过将脚本顶部的“shebang”行更改为 Bash? #!/bin/bash
  • 是的,也这样做了.. 仍然看不到内部回声。没有错误信息,什么都没有。
  • 第一个回显中有$CLIENT_NAME 的值吗?你是如何调用脚本的?您使用的实际命令是什么? which bash 的输出是什么?
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
相关资源
最近更新 更多