不同的运算符如何处理给定的字符串

不同的运算符如何处理给定的字符串

我想读取两个字符串作为 bash 脚本的参数,这两个字符串是扩展名,然后我想将文件的扩展名从第一个扩展名替换为第二个扩展名。

到目前为止我能想到/找到的最好的办法是:

#!/bin/bash
first=$1
second=$2
for files in *.$1
do
  mv "$files" "${files%.$1}.$2"
done

现在,我们假设$1cpp,并且$2C

我的“疑问”是:

  1. 是否.$1等于.cpp
  2. 等于*.$1说:*.cpp
  3. 第 6 行等于吗mv "$files" "${files%.cpp}.C"
  4. 前面的代码是否可以处理带有空格(如:)my file.cpp或点(如my.file.cpp)的文件名?

我知道我可以在一个问题中说出前 3 个问题,但我需要了解到底发生了什么,以及每个运算符(./ */ %)将如何处理参数中的给定字符串。

答案1

您有两个拼写错误,写成&了“代替$寻址变量”,但除此之外它应该可以工作。

此外,带有空格的文件名也可以起作用,因为您正确地引用了它们。

次要细节:我建议将变量重命名$files$file,因为它始终只包含循环列表中的单个文件名。

答案2

您的代码是正确的,但有一点需要注意约瑟夫·R。关于包含破折号的文件。但是第 2 行和第 3 行似乎是多余的,因为您没有在代码片段中使用变量first和。second

为了减轻您的“疑虑”(假设$1cpp,且$2C):

  1. 这里.不是运算符,所以 bash 只是对 进行了参数扩展$1。所以答案是肯定的,.$1等于.cpp
  2. 参数扩展优先于路径名扩展(关联),意思*.$1 是等于*.cpp
  3. 同样,该行会按照您的预期执行,因为首先会$1扩展并交给由%
  4. 双引号阻止 bash 执行场分裂,这通常会导致文件名包含空格的问题

相关内容