0

我正在编写一个shell脚本,这样当我尝试编译ac文件时,我就不必每次都给clang相同的参数......(使用Sublime并尝试构建和运行......

#!/bin/bash
cd "$(dirname "$1")"
clang "-Wall $(basename "$1") -o $(basename "$1" ".${1##*.}")"

我犯了一个非常愚蠢的错误吗?或者有可能吗?

如果我希望它立即运行,我应该删除 -o 吗?

科兰

4

3 回答 3

2

双引号内的所有内容都是一个参数,所以...:

clang -Wall "$(basename "$1")" -o "$(basename "$1" ".${1##*.}")"
于 2011-10-05T18:16:49.523 回答
0

将举例说明。这是可以接受的:

a=getAnum(randomize(10*(34)))

这就是你所做的:

a=getAnum(randomize)10*(34)()

您的引号充当第二个代码行中的括号。这就是为什么在大多数编程语言中,当我们想在双引号之间嵌套一些东西时,我们通常使用单引号,比如:“I ate 'pizza' and 'tuna'” 来获取字符串:I ate 'pizza' and 'tuna'

然而在shell中双引号和单引号是很不一样的。双引号让你在它们之间有变量,而单引号将把所有的东西放在它们之间并按字面意思使用它,这样特殊符号就可以像普通文本一样被解释。

在您的情况下,我会在不需要时完全取消引号,例如:

cd "$(dirname "$1")"

变成这样:

cd $(dirname "$1")

或这个:

cd $(dirname $1)

然而这:

cd '$(dirname $1)'

或这个:

cd $(dirname '$1')

行不通。它将取单引号之间的所有内容并将其解释为文本。因此,在第一种情况下,它会尝试输入一个名为$(dirname $1)的目录,而在第二种情况下,它将运行dirname $1

于 2011-10-05T18:55:41.663 回答
0

像这样尝试:

#!/bin/bash
if [ "$1" ] ; then
    cd "$(dirname "$1")"
    clang -Wall "$(basename "$1")" -o "$(basename "${1%%.c}")"
fi

当您计划编译更多文件时,请开始使用 Makefile。

于 2011-10-05T18:31:08.017 回答