如何编写 bash 脚本来编译多个包含空格的文件?

如何编写 bash 脚本来编译多个包含空格的文件?

这是我的代码:

#!/bin/bash
FILES=~/Desktop/cpp/$1/*
mkdir ~/Desktop/cpp/$1o 
for f in $FILES
do
    echo $(basename $f) >>  ~/Desktop/cpp/$1err.log
    g++ '"'$f'"' -std=c++11 -o '"'~/Desktop/cpp/$1o/$(basename "$f").out'"' 2>>  ~/Desktop/cpp/$1err.log
done

如果我不使用“”部分,那么该脚本对于没有空格的文件可以正常工作。使用它们,它会说:

usr/bin/ld: cannot open output file /dirname/-
x.out: No such file or directory

如何在文件名两边添加引号以便支持空格?

答案1

您需要用双引号引用变量,而不是'"'文字双引号字符串,而只是普通"$f"双引号。看忘记在 bash/POSIX shell 中引用变量的安全隐患对于所有血淋淋的细节。

我会使用更多变量来减少重复。

尝试这个:

#!/usr/bin/env bash
cppdir="$HOME/Desktop/cpp/$1"
if [[ ! -d "$cppdir" ]]; then
    echo "No such directory" >&2
    exit 1
fi

outdir="${cppdir}o"
mkdir -p "$outdir"

errlog="${cppdir}err.log"

for f in "$cppdir"/*; do
    b=$(basename "$f")
    printf '%s\n' "$b" >> "$errlog"
    g++ "$f" -std=c++11 -o "$outdir/$b.out" 2>> "$errlog"
done

答案2

标准方法是使用findandxargs并带有NUL- 字符作为分隔符:

outdir="$1"o
mkdir "$outdir"
errlog="$1"err.log
touch "$errlog"

find ~/Desktop/cpp/"$1"/ -type f -name '*.cpp' -print0 |
  xargs -0 -I source bash -c "echo source >> $errlog &&
    g++ source -std=c++11 -o source.out 2>> $errlog"

相关内容