我正在编写一个shell脚本,这样当我尝试编译ac文件时,我就不必每次都给clang相同的参数......(使用Sublime并尝试构建和运行......
#!/bin/bash
cd "$(dirname "$1")"
clang "-Wall $(basename "$1") -o $(basename "$1" ".${1##*.}")"
我犯了一个非常愚蠢的错误吗?或者有可能吗?
如果我希望它立即运行,我应该删除 -o 吗?
科兰
我正在编写一个shell脚本,这样当我尝试编译ac文件时,我就不必每次都给clang相同的参数......(使用Sublime并尝试构建和运行......
#!/bin/bash
cd "$(dirname "$1")"
clang "-Wall $(basename "$1") -o $(basename "$1" ".${1##*.}")"
我犯了一个非常愚蠢的错误吗?或者有可能吗?
如果我希望它立即运行,我应该删除 -o 吗?
科兰
双引号内的所有内容都是一个参数,所以...:
clang -Wall "$(basename "$1")" -o "$(basename "$1" ".${1##*.}")"
将举例说明。这是可以接受的:
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。
像这样尝试:
#!/bin/bash
if [ "$1" ] ; then
cd "$(dirname "$1")"
clang -Wall "$(basename "$1")" -o "$(basename "${1%%.c}")"
fi
当您计划编译更多文件时,请开始使用 Makefile。