包含函数的bash脚本在运行时根本不做任何事情

时间:2017-11-08 17:07:14

标签: bash

我想从目录中删除一些重复的文件。 在我$PATH的目录中,我编写了一个包含以下内容的脚本remove_duplicates

$:~/local/bin cat remove_duplicates
#!/bin/bash

remove_duplicates() {
  for i in *
  do
#  echo ${i}
    if [ -e ${i}.~1~ ]
    then
      hash1=$(md5sum ${i} | awk '{print $1}')
      hash2=$(md5sum ${i}.~1~ | awk '{print $1}')
      if [ "$hash1" = "$hash2" ]
      then
        rm -v ${i}.~1~
      fi
    fi
  done
}

当我在包含重复文件的目录中执行脚本时,它不会删除副本。

$:~/.vim/colors md5sum candycode*
8b115e7b2ed03eb949c9c0b2cf049012  candycode.vim
8b115e7b2ed03eb949c9c0b2cf049012  candycode.vim.~1~

$:~/.vim/colors which remove_duplicates
~/local/bin/remove_duplicates

$:~/.vim/colors remove_duplicates

$:~/.vim/colors md5sum candycode*
8b115e7b2ed03eb949c9c0b2cf049012  candycode.vim
8b115e7b2ed03eb949c9c0b2cf049012  candycode.vim.~1~

我认为问题可能出在我*循环中for的扩展中,但我不确定如何正确扩展(即展开以包含所有文件)在调用脚本的目录中。) 我认为问题出在哪里的原因是当我取消注释脚本中的echo ${i}行时,我看不到任何与stdout相呼应的内容。
我还尝试将*替换为$PWD/*,但这似乎没有做任何事情。

1 个答案:

答案 0 :(得分:2)

您正在定义一个功能,但没有运行它。

也就是说,当你运行这个脚本时,它会逐行执行并执行它。这样做的目的是定义一个名为remove_duplicates的函数..然后它到达文件的末尾并完成。

您可以在最后调用remove_duplicates添加一行,或者您可以删除首先使其成为函数的声明:

#!/bin/bash

  for i in *
  do
#  echo "${i}"
    if [ -e "${i}.~1~" ]
    then
      hash1=$(md5sum "${i}" | awk '{print $1}')
      hash2=$(md5sum "${i}.~1~" | awk '{print $1}')
      if [ "$hash1" = "$hash2" ]
      then
        rm -v "${i}.~1~"
      fi
    fi
  done