我正在尝试使用如下所示的 for 循环,通过将参数传递给函数来逐个读取文件。由于文件名中存在空格,参数 3 会产生很多问题。
例子:
source_file_restructure()
{
echo "inside the function"
source_folder=$1
target_folder=$2
file_pattern=$3
delimiter=$4
echo $file_pattern
echo " Getting inside the function.... "
for file_name in `ls -Al ${source_folder}*"${file_pattern}"*.csv`
do
some processing.......
done
当文件包含空格(例如文件 1.csv)时,上述 ls 命令无法正常工作,
输入 :
SOurce Folder : /home/test/
File Pattern : "file"
Function argument :
source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}
建议一些选项来处理该问题。
答案1
代替
for file_name in `ls -Al ${source_folder}*"${file_pattern}"*.csv`
和:
for file_name in "${source_folder}"*"${file_pattern}"*.csv
反引号中的命令输出(如上面的第一种形式)会受到分词的影响。上面的第二种形式不使用反引号。相比之下,它可以处理任何文件名,甚至包含空格、制表符、换行符或任何其他困难字符的文件名。
另外,更换
source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}
和
source_file_restructure "${source_folder}" "${target_folder}" "${file_pattern}" "${delimiter}"
如果没有双引号,shell 将执行分词。使用双引号,即使source_folder
或target_folder
有空格、制表符、换行符或其他困难字符,该函数也将被正确调用。
答案2
您必须在第一个脚本中设置以下环境变量:
IFS=$(echo -en "\n\b")
答案3
我在我的一个脚本中使用了类似的东西:
ls -Q "$folderToRead" | while read file # ls -Q puts every entry between quotes : "file".
do
file=`echo $file | tr -d '"'` # This erases the quotes from the -Q argument, so you
# can work on the file without worrying about it.
当然,您必须通过编辑 ls 命令使其在脚本中运行。我刚刚写了简短的版本。