循环遍历包含空格的文件夹,作为 bash 脚本中的参数传递

循环遍历包含空格的文件夹,作为 bash 脚本中的参数传递

我读过大量接近我需要的答案,但并不完全准确,而且我不知道如何使它们适应我的需要。

我想编写一个 bash 脚本,该脚本将源文件夹作为参数,并对该文件夹中的每个文件(特定类型)执行一系列操作。

src_dir=$1

for file in $src_dir/*.jpg; do
    filename=`basename "$file"`
    basename="${filename%.*}"
    ...
done

如果 src_dir 中没有空格,则可以工作,但如果有空格,我无法弄清楚如何使其工作。通常"$src_dir"有效,但这不适用于for file in.

编辑:我应该提到,我希望能够传递包含需要扩展的变量的路径(等$HOME$MY_PROJECT_PATH所以单勾'也不是理想的)

答案1

当你说它不适用于引号时,那么我假设你已经引用了整体 $src_dir/*.jpg少量。然后,是的,它不会工作,因为*它不再是带引号的字符串中的通配字符。

但是,如果您只引用$src_dir,它将起作用:

src_dir=$1

for pathname in "$src_dir"/*.jpg; do
    name_noext=$( basename -- "$pathname" .jpg )
    ...
done

*使得 shell 将其用作通配符。

至于您的编辑:当使用 eg 调用脚本时$HOME,我假设它是使用扩张变量的HOME,而不是文字字符串$HOME。如果脚本必须测试提供的目录路径是否包含文字变量名称,这将是一个令人难以置信的问题,其中包括必须确定该字符串$HOME是变量还是目录的文字名称(技术上可能是)。这与$src_dirfor 循环的扩展无关。

答案2

您只需要双引号即可src_dir。另外,如果您不想让随机变量污染您的 shell,请使用子 shell:(src_dir=$1; for file in "$src_dir"/*.jpg; do ... done)

相关内容