如何在shell脚本中将相对路径或绝对路径用作单个命令行参数?
例如,假设我的shell脚本在我的桌面上,我想循环遍历文件系统中某个文件夹中的所有文本文件。
我试过sh myshscript.sh /home/user/Desktop
,但这似乎不可行。我如何避免使用空格的目录名和文件名?
myshscript.sh包含:
for i in `ls`
do
cat $i
done
答案 0 :(得分:2)
表面上,你可以写:
cd "${1:-.}" || exit 1
for file in *
do
cat "$file"
done
除了在这种情况下你真的不需要for
循环:
cd "${1:-.}" || exit 1
cat *
会做这个工作。您可以通过以下方式避免cd
操作:
cat "${1:-.}"/*
列出(cat
s)给定目录中的所有文件,即使目录或文件名包含空格,换行符或其他难以管理的字符。您可以使用任何适当的glob模式代替*
- 如果您希望文件以.txt
结尾,则使用*.txt
作为模式。
如果您的文件太多而参数列表太长,则会出现故障。在这种情况下,您可能需要使用find
:
find "${1:-.}" -type f -maxdepth 1 -exec cat {} +
(请注意,-maxdepth
是GNU find
扩展名。)
避免使用ls
生成文件名列表,特别是如果脚本必须在名称中的空格,换行符等方面都很健壮。
答案 1 :(得分:1)