在 shell 脚本中,许多文件作为源文件并登陆到特定目录,但很少有文件带有空格字符,导致脚本失败。
#!/bin/bash
SRC_DIR=/home/user123/data/src
while true
do
..............
file_proc()
{
file=$1
export JOB_SEQ=$2
......
file_src=${SRC_DIR}/${file}
............
}
done
Run Code Online (Sandbox Code Playgroud)
在源文件路径中,在 UNIX 终端中-
user123@hostname src]$ pwd
user123@hostname src]$ /home/user123/data/src
user123@hostname src]$ ls -lrt
Jul 16 12:00 Test_data_123.csv
Jul 16 12:00 Test data_234.csv
Jul 16 12:01 Test_data_345.csv
Jul 16 12:01 Test_data 456.csv
.........................
Run Code Online (Sandbox Code Playgroud)
我使用了tr ' ' '_'& sed 's/ /_/g'(意味着file_src=${SRC_DIR}/${file} | tr ' ' '_'),但它无法_使用 shell 脚本将文件名中的空格转换为字符。我只想在文件名中使用 shell 脚本空间,_然后将其转换为进程,而不会导致 shell 脚本失败。
我怀疑您在断腿上贴了创可贴,而真正的问题是对脚本中其他位置包含空格的文件名的处理不正确(例如不正确的引用),在这种情况下,将空格转换为下划线并不是解决方案。但是,在没有看到代码的其他部分或不知道为什么要这样做的情况下,这只是一个猜测,我们无法进一步帮助您。
关于您具体询问的内容 - 听起来您正在这样做:
file_src=${SRC_DIR}/${file} | tr ' ' '_'
Run Code Online (Sandbox Code Playgroud)
当你应该这样做时:
file_src=$(printf '%s\n' "${SRC_DIR}/${file}" | tr ' ' '_')
Run Code Online (Sandbox Code Playgroud)
或者最好是:
file_src="${SRC_DIR}/${file}"
file_src="${file_src// /_}"
Run Code Online (Sandbox Code Playgroud)
甚至更好,因为SRC_DIR是脚本的硬编码部分并且不包含空格,只是:
file_src="${SRC_DIR}/${file// /_}"
Run Code Online (Sandbox Code Playgroud)