【问题标题】:What is this bash code doing?这个 bash 代码在做什么?
【发布时间】:2012-04-25 02:02:26
【问题描述】:

这是我在一个开源项目(不在本系统上编译)中名为 libtool 的文件中找到的一些代码:

  case $arg in
  -*=*)
    optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
  *) optarg= ;;
  esac 

我收到了 case 语句,但我不确定第一行 optarg=... 是否存在。它想达到什么目的?对于这个测试用例,让:

CC="arm-elf-gcc"
arg="--tag=CC"
Xsed="/usr/bin/sed -e 1s/^X//"

在 OS X 中运行它让我受益匪浅:

../libtool: line 828: X--tag=CC: command not found

我认为它可能试图将“arm-elf-gcc”分配给变量 optarg,但我不确定。该软件在 Ubuntu 中整体编译正常,但 libtool 文件看起来很不一样。

【问题讨论】:

  • 您缺少$echo 的定义;在大多数 GNU 软件中,这是搜索不扩展转义序列的 echo 实现的结果。
  • @geekosaur 调试,发现$echo为空。知道该怎么做(获得新的回声?)?
  • 您可以尝试将其设置为echo。此外,如果您使用在另一个系统(例如,Linux 与 OS X)上生成的 libtool,您可能需要运行 libtoolize 来生成适用于本地系统的 libtool

标签: bash libtool


【解决方案1】:

对于您的示例,arg="--tag=CC" 正在尝试隔离值 CC

它通过使用正则表达式删除--tag= 来做到这一点。 sed 命令s/A/B/ 将任何与 A 匹配的内容替换为 B。A 是一个正则表达式,用于查找字母、数字、下划线和破折号后跟等号的任意组合,而 B 为空。因此,当它看到 --tag=CC 时,正则表达式匹配 --tag 时将其替换为空,因此值只是 CC

【讨论】:

    【解决方案2】:

    这只是处理形式的命令行参数

    `--option=value`
    

    在正常的getopts处理中,如果指定-o value,则变量optarg设置为value;如果您改为指定上面的长格式(这看起来像是 getopts 的一个大选项参数),此代码可确保发生同样的事情。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多