Bash 请使用此.sh代码进行帮助

Bash 请使用此.sh代码进行帮助,bash,shell,Bash,Shell,我正在尝试创建一个shell脚本,当您在终端中键入以下内容时,该脚本将更改文件扩展名: extcha xx yy*.xx 这是我编写的代码 #!/bin/sh while [ *.$1 ] ; do export name=`basename $i .$1` echo mv $name.$1 $name.$2 done; 这似乎不起作用。有人能告诉我哪里出了问题吗?您可以使用重命名实用程序。。。它做到了这一点 编辑:脚本 #!/bin/bash from="$1" sh

我正在尝试创建一个shell脚本,当您在终端中键入以下内容时,该脚本将更改文件扩展名:

extcha xx yy*.xx

这是我编写的代码

#!/bin/sh

while [ *.$1 ] ; do

    export name=`basename $i .$1`
    echo mv $name.$1 $name.$2

done;

这似乎不起作用。有人能告诉我哪里出了问题吗?

您可以使用
重命名
实用程序。。。它做到了这一点

编辑:脚本

#!/bin/bash

from="$1"
shift
to="$1"
shift

IFS="
"
for f in $@
do
  basefile="`basename "$f" ".$from"`"
  if [ ! "$basefile" = "$f" ]
  then
    echo mv "$basefile.$from" "$basefile.$to"
  fi
done
改为:

for i in  *.$1 ; do


    name=`basename $i .$1`
    mv $name.$1 $name.$2

done

不要忘记添加一些错误检查(例如,有两个参数)

以下是您要执行的操作:

for name in *.$1; do
    stripped_name="$(basename "$name" ".$1")"
    mv "$name.$1" "$name.$2"
done
您的最大缺陷是while循环只评估该条件,有效地测试具有该形式名称的文件的存在。它不在任何变量中存储任何内容-当然不是像
$i
这样的任意内容。你也不需要在这里出口任何东西。这只会使它对子进程可见,而您不需要这些子进程

当然,您可以使用重命名实用程序。基本的(红帽和朋友):

使用精美的perl one(debian/ubuntu):


难道你不需要执行命令,而只是重复它吗?@Pablitorun,谢谢你指出这一点。注意,Linux中有两种不同的重命名,一种是使用简单的字符串替换,另一种是使用Perl正则表达式。我相信前者在redhat系列中使用,后者在debian/ubuntu系列中使用——我不知道其他发行版的情况。我试图使用while状态,找到所有xx扩展($1),并将其更改为yy扩展($2)。基本上我想用一个while循环来执行这个文件。@teaths先生:是的,但是为什么?重命名实用程序可以为您执行此操作。我从未听说过重命名实用程序。我一个月前才开始使用bash。只是尽量保持简单而已。谢谢你的密码。我将其拆分并研究其工作原理。如果没有以$1结尾的文件,或者$1包含空格,则会中断。@Eric,这可能就是我建议添加一些错误检查的原因:(
# Note that this will actually rename abc.foo.foo to abc.bar.foo
# since it replaces the first match.
rename .foo .bar *.foo
rename 's/.foo$/bar/' *.foo