如何使用 echo 为变量赋值但不在终端中显示它

如何使用 echo 为变量赋值但不在终端中显示它

我的 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

...它使用zshshell、其替代的、更短的循环形式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

相关内容