使用shell脚本 - >得到一个错误

时间:2011-10-05 18:13:57

标签: c shell sublimetext

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

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

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

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

克兰

3 个答案:

答案 0 :(得分:2)

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

clang -Wall "$(basename "$1")" -o "$(basename "$1" ".${1##*.}")"

答案 1 :(得分:0)

尝试就像这样:

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

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

答案 2 :(得分:0)

将用一个例子来解释。 这是可以接受的:

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

这就是你所做的:

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

您的引号充当第二个代码行中的括号。这就是为什么我们在大多数编程语言中想要在双引号之间嵌套内容时通常使用单引号,如下所示: “我吃'披萨'和'金枪鱼'” 获取字符串:I ate 'pizza' and 'tuna'

但是在shell中双引号和单引号是非常不同的。双引号允许你在它们之间有变量,而单引号会把它们之间的所有东西都用在字面上,以便特殊符号的解释就像普通文本一样。

在你的情况下,我会在不是nessecary时完全取下引号,以便例如:

cd "$(dirname "$1")"

成为这个:

cd $(dirname "$1")

或者这个:

cd $(dirname $1)

但是这个:

cd '$(dirname $1)'

或者这个:

cd $(dirname '$1')

无效。它将采用单引号之间的所有内容并将其解释为文本。因此,在第一种情况下,它将尝试输入名为 $(dirname $ 1)的目录,在第二种名称中,它将运行 dirname $ 1