我的 bash 脚本
#!/bin/bash
read -r -p "Enter the filenames: " -a arr
for i in "${arr[@]}"
do
echo $i | sed 's/\(.*\)\..*/\1/'
cp -v ~/Desktop/library/template.py "$i".py
done
如果我写A B.py C D.py
,这个脚本会将其变成解释正在做什么的A.py B.py C.py D.py
-v
标志cp -v
但是我不想打印编辑后的文件名echo $i
。它很烦人。
我怎样才能做到这一点?
替代解决方案也受到赞赏
答案1
您想要修剪$i
字符串中最后一个点之后的值。
你可以这样做:
i=${i%.*}
$i
这会删除与文件名通配模式匹配的最短后缀字符串.*
(一个点后跟任何字符串)。
如果您知道要.py
专门修剪:
i=${i%.py}
这意味着您可以cp
像这样编写命令:
cp -v ~/Desktop/library/template.py "${i%.py}.py"
这将是循环体中唯一的命令,如果值具有这样的后缀,它将.py
从 中删除文件名后缀,然后添加.这可确保目标文件名始终具有文件名后缀,同时避免后缀重复。$i
.py
.py
脚本建议:
#!/bin/sh
for string do
cp -v ~/Desktop/library/template.py "${string%.py}.py"
done
或者,
#!/bin/zsh
for string; cp -v ~/Desktop/library/template.py $string:r.py
...它使用zsh
shell、其替代的、更短的循环形式for
及其修饰符在添加到名称:r
之前删除文件扩展名。.py
您可以像这样调用任一脚本:
./script A B.py C D.py
答案2
我发现了一个技巧:
#!/bin/bash
read -r -p "Enter the filenames: " -a arr
for i in "${arr[@]}"
do
var=$(echo "$i" | sed 's/\(.*\)\..*/\1/')
cp -v ~/Desktop/library/template.py "$var".py
done