在文件中用下划线替换空格:我的 bash 脚本中出现错误

在文件中用下划线替换空格:我的 bash 脚本中出现错误

我不明白 bash 脚本中的错误。

#!/bin/bash
newFile=""
for file in *
do
    newFile={$file/ /_}     # so as to replace spaces with underscores
    mv {$file} {$newFile}
done

它抱怨这newFile不是行中的命令newFile={$file/ /_}

我想我做错了,但我在这一点上一直绊倒。

答案1

您需要移动 $ 的位置并向/子添加最后一个以对所有空格执行此操作。您还需要引用变量,因为它将把文件名中的空格视为 mv 参数之间的分隔符。

#!/bin/bash
newFile=""
for file in *
do
    newFile=${file// /_}     # so as to replace spaces with underscores
    mv "{$file}" "{$newFile}"
done

尽管如其他答案所述,该脚本的一半是多余的。

newFile=""

根本不需要,因为稍后可以在赋值中首先引用该变量。

 newFile=${file// /_}

尽管赋值本身也不是必需的,因为参数替换不会改变原始值。

所以它可以重写为

#!/bin/bash
for file in *
do
    mv "${file}" "${file// /_}" 
done

答案2

根据对您问题的评论回答您的问题:

  1. 您需要将美元字符放在$大括号字符之前{
  2. ""除此之外,引用 ( ) 变量是一个很好的做法。
  3. 最后,要将所有空格替换为下划线,您需要使用两个斜杠 ( //) 来“贪婪”替换。

因此示例脚本将如下所示:

#!/bin/bash

for myfile in *
do
    mv "${myfile}" "${myfile// /_}"
done

笔记:不需要额外的变量来保存新名称

相关内容