【问题标题】:Protection of special characters in For LoopsFor循环中特殊字符的保护
【发布时间】:2022-11-16 16:59:39
【问题描述】:

在下面的脚本中,我使用 * 由 bash 解释(文件 globbing)

for l in /home/ubuntu/*
do 
       echo "$l"
done

特殊字符 * 首先被 bash 解释,然后扩展。好的,一切都很好! 所以我试图保护 * 免受 bash 的通配符解释:

for l in '/home/ubuntu/*' (or "home/ubuntu/*")
do 
       echo "$l"
done

不幸的是它不起作用:输出没有改变!我认为这是一个“一般规则”,“”,''和\保护*特殊字符。为什么会这样?

除此之外,还有其他关于for循环的问题我不清楚。 例如,考虑下面的代码:

for i in 1    2    3
do
      echo $i
done

Output: 1
        2
        3

即使更改 $IFS,结果也不会改变。 在上面的脚本中,所有的 " " 都没有被考虑在内,这与 echo 命令不同:

 echo 1    2    3
 Output: 1    2    3

所以我稍微改变了一下:

 for i in "1    2    3"
 do
       echo $i
 done

在这种情况下 $i 只“得到”一个参数“1 2 3”但它改变了它,挤压“”:

 Output 1 2 3

................................................... …………

【问题讨论】:

  • 对于一个问题,您在这里有太多东西,而且您描述的两件事根本不符合 bash 所做的事情。在第二个for循环示例(for l in '/home/ubuntu/*'echo "$l")中,引号将要防止通配符扩展,它只会打印“/home/ubuntu/*”。另外echo 1 2 3 将只打印“1 2 3”(数字之间的单个空格),因为“1”、“2”和“3”被视为echo 的单独参数(无论它们之间有什么空格) , echo 打印由单个空格分隔的参数。
  • 我的错误,抱歉...我在交互模式下编写和测试脚本,你知道吗?不是脚本模式。在交互模式下for l in '/home/ubuntu/*' * 被扩展甚至被'...'“保护”。
  • 不是这样,引用在交互模式和非交互模式下是一样的。必须有其他事情发生。你在运行命令吗确切地正如问题中给出的?
  • 啊,我以 root 身份运行它们:所以在交互模式下 * 被扩展甚至受到保护,而在非交互模式下它不是。我已经返回到我的用户帐户,然后一切正常!将考虑最后两个示例以尝试理解其背后的逻辑。
  • 不,即使是 root,bash 的工作原理也是一样的:* 引号内是未展开.你能 100% 确定你没有不小心写了 echo $l(没有双引号)吗?

标签: linux bash shell for-loop ifs


【解决方案1】:

尝试:

for l in '/home/ubuntu/'*
do 
       echo "$l"
done

单引号不会出现通配,所以需要在外面加上*

为防止挤压,请使用 ${var} 而不是 $var

for i in '1    2    3'
do
      echo "${i}"
done

此外,我建议在 1 2 3 周围使用单引号以及您想要保留的任何字符串文字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 2022-08-18
    • 2017-04-03
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多