2

我正在对 Unix 课程进行介绍,并坚持完成最后的作业。我需要编写一个脚本来更改脚本运行时输入的文件名的文件扩展名。运行脚本时也会输入新的文件扩展名。该脚本调用 chExt1.sh 。我们第一次试用脚本运行如下

./chExt1.sh cpp aardvark.CPP

该脚本假设将第二个输入文件扩展名更改为第一个输入中给出的文件扩展名。文件名与文件扩展名或文件扩展名作为新扩展名无关紧要,也不仅仅是将大写字母更改为小写字母。如果给出以下内容,希望能非常清楚地说明这一点:

./chExt1.sh istink helpme.plEaSe

该脚本会将 helpme.plEaSe 更改为 helpme.istink 。我在这个论坛和谷歌上搜索过,并没有尝试我发现的不同示例。以下是我尝试过的一些示例以及我目前拥有的示例。当前的

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

echo 只是为了看看它是否有效,如果我让它有效,我将添加一个 mv 来保存它。我尝试过的其他人:

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

我似乎找不到我用过的其他一些 sed 但它们涉及很多反斜杠和 () 与 .* 在那里。我没有尝试 basename 命令,因为我不知道要输入的文件扩展名,而且我看到的所有示例都要求您指定要删除的内容,而我不能。我没有列出我使用的所有不同的报价变体,但我已经尝试了很多。我的说明说要使用 sed 命令,因为我们应该知道如何在课堂上使用它,但是当我尝试这样做时,我不会只隔离文件的结尾,而且我相信(因为它需要很长时间才能完成)它正在浏览整个文件并寻找 .'s 和之后的任何内容,因为我一直在做 .* 作为模式。谢谢你提供的所有帮助。

4

1 回答 1

1

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

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

于 2012-11-29T03:12:09.580 回答