gpt4 book ai didi

linux - 一个目录中的所有文件,linux

转载 作者:IT王子 更新时间:2023-10-29 00:48:57 25 4
gpt4 key购买 nike

今天我在 linux 中尝试了一个脚本来将所有文件放在一个目录中。这非常简单,但我发现了一些有趣的东西。

 #!/bin/bash
InputDir=/home/XXX/
for file in $InputDir'*'
do
echo $file
done

输出是:

/home/XXX/fileA /home/XXX/fileB 

但是当我直接输入目录时,比如:

 #!/bin/bash
InputDir=/home/XXX/
for file in /home/XXX/*
do
echo $file
done

输出是:

/home/XXX/fileA
/home/XXX/fileB

在第一个脚本中,似乎只有一个循环,所有文件名都存储在 FIRST 循环中的变量 $file 中,以空格分隔。但是在第二个脚本中,一个文件名只在一个循环中存储在 $file 中,并且有不止一个循环。这两个脚本到底有什么区别?

非常感谢,也许我的问题有点幼稚..

最佳答案

行为是正确的并且“符合预期”。

for file in $InputDir'*' 表示 assign "/home/XXX/*"to $file(注意引号)。由于你引用了星号,所以此时不​​会执行。当 shell 看到 echo $file 时,它首先扩展变量,然后进行 glob 扩展。所以在第一步之后,它看到了

echo /home/XXX/*

在 glob 扩展之后,它看到:

echo /home/XXX/fileA /home/XXX/fileB

只有现在,它才会执行命令。

在第二种情况下,模式/home/XXX/* 在执行for 之前展开,因此目录中的每个文件都分配给file 然后执行循环体。

这会起作用:

for file in "$InputDir"*

但是它很脆;例如,当您忘记将 / 添加到变量 $InputDir 的末尾时,它将失败。

for file in "$InputDir"/*

稍微好一点(Unix 会忽略路径中的双斜杠)但是当 $InputDir 未设置或为空时它会导致问题:您会突然在 中列出文件/ (根)文件夹。例如,由于拼写错误可能会发生这种情况:

inputDir=...
for file in "$InputDir"/*

在 Unix 上大小写很重要 :-)

为了帮助您理解这样的代码,请在您要调试的代码之前的一行中使用 set -x(“启用跟踪”)。

关于linux - 一个目录中的所有文件,linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16082205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com