迭代目录时如何跳过txt文件?

时间:2017-03-31 21:32:43

标签: shell unix zsh

好吧,所以我正在尝试编写一个简单的shell脚本来检查更新,或者只是更新所有软件包,包括自制软件本身。我试图将可执行文件名回显为txt文件,并在最后获取txt文件。问题是在我的脚本中,无论我做什么,它总是在它创建的文本文件中包含文本文件的名称。如何跳过文本文件,或删除包含pkg.txt的整行?请记住,它不会像删除最后一行那么简单,因为包按字母顺序列出,如果我安装任何以大于p的字母开头的包,它将删除该行。

到目前为止,这是我的代码。

for FILE in $HOME/.brew/bin/* ; do
  TRIM=$(basename $FILE)
  if [ "$FILE" != "*.txt" ] ; then
    echo "brew upgrade \c" >>  pkg.txt ; echo $TRIM >> pkg.txt
  fi
done

不确定是否重要,但我目前正在iTerm2中运行zsh。

2 个答案:

答案 0 :(得分:2)

失败,因为[ "$FILE" != "*.txt" ]是文字字符串比较。

Zsh支持[[ "$FILE" != *.txt ]]与模式匹配(bash和ksh也支持。对于dashsh,请使用@ Barmar的建议。

这是在你的代码中:

#!/usr/bin/zsh
for FILE in $HOME/.brew/bin/* ; do
  TRIM=$(basename $FILE)
  if [[ "$FILE" != *.txt ]] ; then
    echo "brew upgrade \c" >>  pkg.txt ; echo $TRIM >> pkg.txt
  fi
done

答案 1 :(得分:1)

使用case匹配模式。

for FILE in "$HOME"/.brew/bin/* ; do
  TRIM=$(basename "$FILE")
  case "$FILE" in
    *.txt) ;;
    *) echo "brew upgrade '$TRIM'" >> pkg.txt ;;
  esac
done