我的 mac 上有一个脚本,我试图在当前位置的子文件夹内的 txt 文件上循环。这是myscript.sh
:
cd /Users/Desktop/
for entry in $(pwd)/txt/*.txt
do
echo $entry
done
*txt
这会打印包含在其中的路径字符串,就像/Users/Desktop/txt/*.txt
我想在 .txt 文件上循环一样,所以我希望echo $entry
打印 txt 文件的名称,但它却打印/Users/Desktop/txt/*.txt
答案1
当您为 shell 提供的通配模式与任何文件名都不匹配时,通配模式将不会扩展。在您的情况下,这意味着echo
循环输出模式本身。
脚本的替代实现:
cd /Users/Desktop || exit 1
for entry in txt/*.txt; do
test -e "$entry" && echo "$entry"
done
如果失败,此实现将以非零退出代码退出cd
。然后它会不是使用pwd
,因为没有必要。它将获取与模式匹配的名称列表,并将迭代这些名称。在每次迭代中,它都会进行测试,以确保文件系统中确实存在具有该名称的内容,然后再将该名称输出到标准输出。
如果您希望echo
lop 内部输出文件的完整路径,请使用echo "/Users/Desktop/$entry"
,甚至更好:
dir="/Users/Desktop"
cd "$dir" || exit 1
for entry in txt/*.txt; do
test -e "$entry" && printf '%s/%s\n' "$dir" "$entry"
done