好吧,所以我正在尝试编写一个简单的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。
答案 0 :(得分:2)
失败,因为[ "$FILE" != "*.txt" ]
是文字字符串比较。
Zsh支持[[ "$FILE" != *.txt ]]
与模式匹配(bash和ksh也支持。对于dash
和sh
,请使用@ 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