bash子串和位置参数

时间:2014-03-05 18:17:28

标签: bash shell command-line-arguments

我必须编译一些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`

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

2 个答案:

答案 0 :(得分:3)

你几乎拥有它:

${1:0:2}

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

答案 1 :(得分:1)

在回答问题的评论时,以下是针对这种情况的示例makefile

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

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