无法在脚本中回显变量 value=*

无法在脚本中回显变量 value=*

我的文件内容:

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 的部分,以获取该特定类型正则表达式语法的所有形式的详细描述。

问题的第二部分似乎是在问如何避免这种情况发生。有两种方法。任何一个逃脱字符前面加上反斜杠\,或者将其放在单引号中,即。'*'

相关内容