Bash变量在OSX终端中返回“未找到命令”

时间:2013-03-22 08:57:28

标签: macos bash

我尝试使用一些变量来重命名一些文件,但它失败了。我已经尝试了不同的方式让它工作,但无济于事。据我了解文档,这是正确的做事方式 - 但现在我很难过......

这是代码(写在文件rename_prefix.sh中):

 #!/bin/sh
 NEWPREF="LALA"
 OLDPREF="LULU"
 for f in $OLDPREF*; do mv $f $(echo $f | sed 's/^$OLDPREF/$NEWPREF/g'); done

以下是错误消息:

 usage: mv [-f | -i | -n] [-v] source target
   mv [-f | -i | -n] [-v] source ... directory

最初我认为问题在于使用我认为是正则表达式的变量,但从错误消息中可以看出,问题在于首先声明变量的地方。

这里发生了什么?

2 个答案:

答案 0 :(得分:4)

这可以完全在shell中完成,这也避免了为sed替换模式转义元字符的可能问题。它也非常快,因为每个文件重命名可以节省两个叉子。

NEWPREF="LALA"
OLDPREF="LULU"
for f in "$OLDPREF"*; do
   mv "$f" "$NEWPREF${f#$OLDPREF}"
done

如果您想了解有关从shell变量值中删除后缀和前缀的更多信息,请阅读POSIX spec on parameter expansion(所有zsh,ksh,mksh和bash支持)。

PS:如果您在rename_prefix.sh: line 2: NEWPREF: command not found之后和NEWPREF之前有空格,那么唯一方式可以获得=之类的错误。它看起来非常像您发布的程序并不完全是您运行的程序。你输入它而不是cut'n'paste吗?

答案 1 :(得分:0)

好的,假设您不需要POSIX,并猜测某些其他细节,这与应用的一般更正相同。

#!/bin/bash
newpref=LALA
oldpref=LULU

shopt -s nullglob

for f in "$oldperf"*; do
    mv -- "$f" "${f/#"$oldpref"/$newpref}"
done

或POSIX

#!/bin/sh
newpref=LALA
oldpref=LULU

for f in "$oldpref"*; do
    [ -e "$f" ] || break
    mv -- "$f" "${newpref}${f#"$oldpref"}"
done