我读过大量接近我需要的答案,但并不完全准确,而且我不知道如何使它们适应我的需要。
我想编写一个 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_dir
for 循环的扩展无关。
答案2
您只需要双引号即可src_dir
。另外,如果您不想让随机变量污染您的 shell,请使用子 shell:(src_dir=$1; for file in "$src_dir"/*.jpg; do ... done)