我正在创建一个bash shell脚本,它将重命名文件扩展名,而不必指定旧的文件扩展名.如果我在Linux中输入"change foo*"到终端,它会将所有文件扩展名更改为foo.
所以我要说我有四个文件:"file1.txt","file2.txt.txt","file3.txt.txt.txt"和"file4".
当我运行命令时,文件应如下所示:"file1.foo","file2.txt.foo","file3.txt.txt.foo"和"file4.foo"
有人可以查看我的代码并更正它.如果有人能为我实现这一点,我也将不胜感激.
#!/bin/bash
shift
ext=$1
for file in "$@"
do
cut=`echo $FILE |sed -n '/^[a-Z0-9]*\./p'`
if test "${cut}X" == 'X'; then
new="$file.$ext"
else
new=`echo $file | sed "s/\(.*\)\..*/\1.$ext/"`
fi
mv $file $new
done
exit
Run Code Online (Sandbox Code Playgroud)
echo "$FILE"和不echo $FILE.如果没有双引号,shell会\[*?在变量值中扩展空格和glob字符().(在某些情况下,您不需要引号,有时您确实需要分词,但这是为了将来的课程.)$FILE包含点:case "$FILE" in *.*) echo yes;; *) echo no;; esac$FILE:${FILE%.*}.例如,如果$FILE是file1.txt.foo,则产生file1.txt.更一般地说,${FILE%SOME_PATTERN}扩展到$FILE最短的后缀匹配SOME_PATTERN剥离.如果没有匹配的后缀,则会扩展为未$FILE更改.该变体${FILE%%SOME_PATTERN}剥离了最长的后缀.同样,${FILE#SOME_PATTERN}并${FILE##SOME_PATTERN}删除后缀.test "${TEMP}X" == 'X'很奇怪.这看起来像是过去被误读的伎俩.写这个的正常方式是[ "$TEMP" = "" ]或[ -z "$TEMP" ].使用==而不是=bash扩展名.如果$TEMP看起来像操作员,曾经有过错误的炮弹可能会错误地解析命令,但这些炮弹已经成为了恐龙的方式,即使这样,也X需要在开始时,因为有问题的操作员开始于-:[ "X$TEMP" == "X" ].-,mv则会认为它是一个选项.用--来说"就是这样,没有更多的选择,无论后面是什么操作数":mv -- "$FILE" "$NEW_FILE".#!/bin/sh(但#!/bin/bash也可以使用)来启动脚本.exit 在脚本的末尾是没用的.应用所有这些,这是生成的脚本.
#!/bin/sh
ext="$1"; shift
for file in "$@"; do
base="${file%.*}"
mv -- "$file" "$base.$ext"
done
Run Code Online (Sandbox Code Playgroud)