【问题标题】:bash substring and positional parametersbash 子字符串和位置参数
【发布时间】:2014-03-06 08:48:07
【问题描述】:

我必须编译一些mysql c api代码并且厌倦了在命令行中编写所有这些:

gcc main.c -o main `mysql_config --cflags --libs`

我在 bash 中编写了一个 shell 脚本,并在 bash 中传递了位置参数:

gcc $1 -o ${"$1":0:2} 'mysql_config --cflags --libs' 但这不起作用。我收到错误消息:./compile: line 2: ${"$1":0:-2}: bad substitution。有人可以告诉我我做错了什么吗?

我让它工作的唯一方法是分配一个新变量:

filename=$1;
gcc $filename -o ${filename:0:-2} `mysql_config --cflags --libs`

这是唯一的方法还是有办法解决我在第一种情况下做错的事情?

【问题讨论】:

  • 是时候开始了解make...或任何其他构建管理工具...
  • @twalberg 我认为make 只适用于大型程序。这只是一个小测试程序。谢谢。
  • 虽然它确实为大型复杂构建提供了最大的好处,但它对于小型单源构建也非常有效......
  • @twalberg 你能告诉我在这种情况下它是如何工作的吗?
  • 在下面发布了一个答案以保持格式。注意gcc 行开头的间距必须是单个制表符。

标签: bash shell command-line-arguments


【解决方案1】:

你差点就吃完了:

${1:0:2}

您不需要在括号内再次引用$1,因为其中的所有内容都将被解释为变量的名称,就像${filename:0:-2} 的情况一样。

【讨论】:

  • +1 对于好奇的一些解释:1 参数的名称。但是,位置参数不是 variables (即,具有有效标识符作为名称的参数),因此您不能使用变量赋值对其进行赋值; 1=somestring 不起作用。要设置位置参数的值,需要使用set 命令。
【解决方案2】:

针对问题下的cmets,这里有一个makefile针对这种情况的例子:

MSQL_FLAGS := $(shell mysql_config --cflags)
MSQL_LIBS  := $(shell mysql_config --libs)

main : main.c
        gcc $(MSQL_FLAGS) -o $@ $< $(MSQL_LIBS)

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2012-05-21
    相关资源
    最近更新 更多