在unix中更改文件扩展名

在unix中更改文件扩展名,unix,file-extension,Unix,File Extension,我正在上Unix课程的入门课,最后的作业还没做完。我需要编写一个脚本来更改运行脚本时输入的文件名的文件扩展名。运行脚本时,还将输入新的文件扩展名。脚本名为call chExt1.sh。我们对该脚本的第一次试用如下 ./chExt1.sh cpp aardvark.CPP 假定脚本将第二个输入文件扩展名更改为第一个输入中给定的文件扩展名。文件名中给出的文件扩展名或作为新扩展名给出的文件扩展名并不重要,也不只是将大写改为小写。如果给出以下内容,希望能够非常清楚地说明这一点: ./chExt1.sh

我正在上Unix课程的入门课,最后的作业还没做完。我需要编写一个脚本来更改运行脚本时输入的文件名的文件扩展名。运行脚本时,还将输入新的文件扩展名。脚本名为call chExt1.sh。我们对该脚本的第一次试用如下

./chExt1.sh cpp aardvark.CPP
假定脚本将第二个输入文件扩展名更改为第一个输入中给定的文件扩展名。文件名中给出的文件扩展名或作为新扩展名给出的文件扩展名并不重要,也不只是将大写改为小写。如果给出以下内容,希望能够非常清楚地说明这一点:

./chExt1.sh istink helpme.plEaSe
脚本将更改为helpme.plEaSe以帮助我.istink。我在这个论坛和谷歌上搜索过,没有尝试过我找到的不同的例子。下面是我尝试过的一些例子和我目前拥有的。 当前

回声只是看看它是否工作,如果我让它工作,我将添加一个mv来保存它。 其他我尝试过的:

newName=`${oldName%.*}`
newName=`${oldName#.*}`
sed 's/\.*//' $oldName > $newName

我似乎找不到我使用过的其他sed,但它们包含了大量反斜杠和带*的()。我没有尝试basename命令,因为我不知道要输入的文件扩展名,我看到的所有示例都要求您指定要删除的内容,但我不能。我没有列出我使用的所有不同的报价变体,但我已经尝试了很多。我的指示是使用sed命令,因为我们应该知道如何从类中使用它,但当我尝试这样做时,我不会只隔离文件的结尾,我相信(因为它需要很长时间才能完成),它会遍历整个文件,并查找“.”和其后的任何内容,因为我一直在这样做。*作为模式。感谢您提供的帮助。

shift
移动位置参数,因此在调用shift之后,第二个参数($2)现在是第一个参数($1)。第二个班次是不必要的,因为您已经完成了对参数的访问。您需要取消换档

#!/bin/sh
fileExtension="$1"
oldName="$2"
newName=${oldName%%.*}${fileExtension}
echo $newName
或者把2美元换成1美元

#!/bin/sh
fileExtension="$1"
shift
oldName="$1"
newName=${oldName%%.*}${fileExtension}
echo $newName

但是,新文件名中仍然缺少一个点。这是留给读者的练习。

sample
rename-ns/\.txt$/\.aaa/*.txt
非常感谢,我尝试删除第二个班次,但没有成功。但当我把2美元换成1美元时,效果很好。谢谢你指出我漏掉了这个点,我可能会一路完成作业而没有抓住那个点。“我试着删除了第二班。”。第二个班次无效,可以保留或删除;这两种方式都无所谓。解决方案是将$2更改为$1或删除第一个班次。如果你的问题解决了,请选择我的答案。
#!/bin/sh
fileExtension="$1"
shift
oldName="$1"
newName=${oldName%%.*}${fileExtension}
echo $newName