【发布时间】: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