你一般应该avoid ls in scripts.
此外,您通常应该更喜欢现代 POSIX $(command substitution) 语法,就像您已经在脚本中的其他几个地方所做的那样;过时的反引号 `command substitution` 语法笨拙,更容易出错。
如果这在当前目录中有效但在其他目录中失败,则表示您在当前目录中有一个与正则表达式匹配的文件,但在其他目录中没有。
无论如何,做你正在尝试的事情的惯用方法就是
cat *email?csv* >e.csv
如果您要匹配文字点,那就是正则表达式中的\.。 ? 是对您的 grep 实际上 所做的事情的字面解释;但在下文中,我将假设您实际上是要匹配 *email.csv*(或者实际上可能甚至可能是 *email.csv 而没有尾随通配符)。
如果你想检查是否有任何文件,如果没有则避免创建e.csv,这有点棘手;可以试试
for file in *email.csv*; do
test -e "$file" || break
cat *email.csv* >e.csv
break
done
或者,查看 Bash 的 nullglob 功能。另见Check if a file exists with wildcard in shell script。
另一方面,如果您只想检查email.csv 是否存在,不使用通配符,这很容易:
if [ -e email.csv ]; then
cat email.csv >e.csv
fi
事实上,这甚至可以简写为
test -e email.csv && cat email.csv >e.csv
顺便说一句,read 可以完美地将一行拆分为标记。
#!/bin/bash
yesterday=$(date --date "$c days ago" +%F)
while IFS=, read -r dir country _
do
cd "path/$dir" # notice proper quoting, too
cat *email.csv* > e.csv
# probably don't forget to cd back
cd ../..
done < "s.csv"
如果这实际上是您的脚本所做的所有事情,那么可能会取消愚蠢且容易出错的cd;
while IFS=, read -r dir country _
do
cat "path/$dir/"*email.csv* > "path/$dir/e.csv"
done < "s.csv"
另见When to wrap quotes around a shell variable。