【发布时间】:2017-07-08 09:53:58
【问题描述】:
我正在尝试编写一个 bash 脚本来生成文件列表。我想我只是在一个循环中调用'find'。不幸的是,它在循环中产生了“find: command not found”错误,我不知道为什么。
为了简短起见,这个精简版复制了问题,而不会让我们陷入不相关的代码中。
#!/bin/bash
IFSprev=$IFS
IFS=$'|'
PATHS='openvpn|vms'
SOURCE='/mnt/store/'
#find "${SOURCE}vms" -type f
for PATH in ${PATHS}
do
echo -----------------------------------
find "${SOURCE}${PATH}" -type f
done
IFS=$IFSprev
在进行故障排除时,我添加了第一个“查找”命令……添加后,它随后在循环中工作。如果我再次将其注释掉,循环中的“查找”将恢复为抛出错误。
鉴于我要将循环输出重定向到一个文件,我可以使用额外的“查找”命令,甚至只是重定向到 null。但是,我是一个好奇的人,我真的很想找出问题所在。
感谢您的任何意见。
【问题讨论】:
-
对您自己的变量使用小写名称以避免覆盖对操作系统或 shell 有意义的变量——就像您在此处所做的那样。参见the relevant POSIX spec,表示全大写名称用于对shell和操作系统有意义的内置变量和环境变量,并且保留至少一个小写字符的变量名称空间供应用程序使用。
-
也就是说——如果你想遍历一个事物列表,你应该使用一个实际的数组,而不是设置 IFS,然后像一个数组一样分割一个字符串。
paths=( openvpn vms ); for path in "${paths[@]}"; do echo "processing $path"; done -
谢谢查尔斯。对 Linux 来说相当新,我读过一些其他页面,这些页面建议使用大写作为变量以便于阅读,但现在它向我指出我完全理解。我也尝试过数组,但是当路径包含空格和随后包含/排除引号导致加倍时遇到了一些问题,但是现在我已经解决了这个非问题,我会回去再看看为什么我的数组是鹅毛的。
-
不知道为什么我的问题被否决了。这是一个菜鸟的错误,但这是一个真正的错误。有人建议我在这里做错了什么吗?
-
不能对反对票发表意见——但通常情况下,真正糟糕的问题会得到不止一个问题,或者被关闭,或者得到一些更有用的关于 为什么 i> 链接到帮助中心很糟糕;我不会出汗一个。
标签: bash for-loop command-line find