![不同的运算符如何处理给定的字符串](https://linux22.com/image/1394551/%E4%B8%8D%E5%90%8C%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E7%BB%99%E5%AE%9A%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我想读取两个字符串作为 bash 脚本的参数,这两个字符串是扩展名,然后我想将文件的扩展名从第一个扩展名替换为第二个扩展名。
到目前为止我能想到/找到的最好的办法是:
#!/bin/bash
first=$1
second=$2
for files in *.$1
do
mv "$files" "${files%.$1}.$2"
done
现在,我们假设$1
是cpp
,并且$2
是C
我的“疑问”是:
- 是否
.$1
等于.cpp
? - 等于
*.$1
说:*.cpp
? - 第 6 行等于吗
mv "$files" "${files%.cpp}.C"
? - 前面的代码是否可以处理带有空格(如:)
my file.cpp
或点(如my.file.cpp
)的文件名?
我知道我可以在一个问题中说出前 3 个问题,但我需要了解到底发生了什么,以及每个运算符(.
/ *
/ %
)将如何处理参数中的给定字符串。
答案1
您有两个拼写错误,写成&
了“代替$
寻址变量”,但除此之外它应该可以工作。
此外,带有空格的文件名也可以起作用,因为您正确地引用了它们。
次要细节:我建议将变量重命名$files
为$file
,因为它始终只包含循环列表中的单个文件名。