我的文件内容:
123
**1
**
尝试显示每个单词的脚本:
for i in $(cat $myfile)
do
echo "$i"
done
结果是echo *
,它列出了我当前目录中的文件,我不知道为什么。所以我尝试处理*
之前的回显。
另一个脚本的内容:
for i in $(cat $myfile)
do
if [[ $i == *\+ ]](regex pattern find 1 * or more.)
then
(?what should I do. I tried i="\*",i="*" etc.; it doesn't work)
fi
echo "$i"
done
答案1
文件名通配发生在for
-line 上,扩展为$(cat $myfile)
,而不是在echo
.
当循环文件的内容时,使用read
:
while IFS= read -r words; do
printf '%s\n' "$words"
done <"$myfile"
也可以看看:
如果您想让每个空格分隔的单词在其自己的输出行上:
awk '{ for (i = 1; i <= NF; ++i) print $i }' "$myfile"
答案2
正确的答案是:不要使用 shell 循环来处理文本。但是,如果你想要快速解决问题,
set -o noglob
for i in $(cat $myfile)
do
echo "$i"
done
set +o noglob
该noglob
选项可防止路径名扩展,因此您可以说出echo *
并获取文件列表*
而不是文件列表。
答案3
您实际上是在问两个问题,但这两个问题都涉及 shell 如何对待角色*
。该字符对 shell 具有特殊含义,正如您所发现的,它充当一种特殊形式的正则表达式,在 shell 手册页中称为全局对于文件名。这就是为什么你会在当前目录中获得文件名列表,它应该是这样的。请参阅 shell 手册页中有关 globbing 的部分,以获取该特定类型正则表达式语法的所有形式的详细描述。
问题的第二部分似乎是在问如何避免这种情况发生。有两种方法。任何一个逃脱字符前面加上反斜杠\
,或者将其放在单引号中,即。'*'
。