我正在尝试在Bash中编写一个简单的实用程序函数,它将在给定目录中执行“操作”。所以我基本上抽象了“转到目录,做某事,然后回来”模式。
inDir() {
if [$# -le 1]; then
return;
else
local dir="$1";
local action="$2";
local cwd=`pwd`;
if [ -d "$dir" ]; then
cd "$dir";
$action;
cd "$cwd";
else
return;
fi
fi
}
不幸的是,当我运行它时,我得到了我认为是一个虚假的错误,我不知道它来自哪里。例如:
$ inDir "/tmp" "touch hi"
正确创建文件/ tmp / hi,但也会出错:
[2: command not found
我不确定这对于阅读错误是否重要,但我的提示以“[”开头。
任何帮助?
答案 0 :(得分:6)
尽管它看起来像什么,'['实际上是一个名为test
的命令,所以:
if [$# -le 1]; then
应该是:
if [ $# -le 1 ]; then
注意'['和下一位代码之间的空格。没有它,代码读作
test$#
我认为这显然是错误的。在结束方括号之前还需要一个空格,它不是命令,而是分隔符。
答案 1 :(得分:1)
@NeilButterworth答案是对的。
bash尝试解决上述常见错误,并引入了内置的数字比较结构(())
。
例如:
if (($# < 1)); then
fi
优先于[]
结构的优点是它使用常规比较运算符(例如&lt;,&gt;,==),并且不需要[]
所需的空格。
对于字符串比较,有类似的结构[[]]
答案 2 :(得分:0)
如果使用子壳
,生活会更简单( cd "$dir"; $action )
对当前shell没有影响。
答案 3 :(得分:0)
这可以帮助您处理更复杂的参数
inDir() {
if [ $# -gt 1 ]; then
local dir="$1"
shift
if [ -d "$dir" ]; then
cd "$dir"
"$@"
cd -
fi
fi
}
所以现在你可以这样做:
inDir /foo touch "file name with spaces"