我有一个 Oracle 数据库表,它将文件的完整路径和名称存储在表列中。在 SQL 客户端中我可以运行:
select file_name from table where request_id=12345
我会得到这个结果:
/home/example_path/example_file_name_1.xls
在 bash 脚本中,我有这样的语句(我大部分是从我正在使用的另一个示例中复制的):
# Get Actual Output File Name
VREQID=12345
ATTACH_FILE=$(sqlplus -s $ORA_USER_PSSWD <<-EOQ3
set heading off
set feedback off
set pagesize 0
set sqlprompt ""
set verify off
set pause off
select file_name from table where request_id=($VREQID)
/
EOQ3
)
echo 'ATTACH_FILE: ' "$ATTACH_FILE"
# Script continues...
然后我的 echo 语句显示:
/home/example_path/example_file_name_ 1.xls
下划线和 1 之间有一个空格。我尝试使用引号来防止这种情况,但没有帮助。
造成这种情况的原因是什么以及如何防止这种情况发生?
答案1
我想与您的 SQL 查询有关的东西会导致该空间,因为我没有看到任何与 bash/shell 脚本相关的机制导致它。我不是 SQL 专家,所以我无能为力,但你有一些 shell/bash 方法可以删除它:
- 参数扩展
如果您像这样调用参数,它将删除所有空格:"${ATTACH_FILE// /}"
$ ATTACH_FILE='/home/example_path/example_file_name_ 1.xls'
$ echo "${ATTACH_FILE// /}"
/home/example_path/example_file_name_1.xls
ATTACH_FILE="${ATTACH_FILE// /}"
- 使用
tr
您可以使用tr
删除空格
ATTACH_FILE=$(echo "$ATTACH_FILE" | tr -d ' ')
- 使用
sed
您还可以使用sed
删除空格
ATTACH_FILE=$(echo "$ATTACH_FILE" | sed 's/ //g')
答案2
根据 @RomeoNinov 的评论 - 这是一个线条大小问题。答案是添加
linesize 300
在运行 sqlplus 查询之前。
答案3
为了避免字符串/自动换行,您可以将输出的宽度设置为大值,例如 300 个符号:
set linesize 300
此外,对于特定列,您可以定义特定格式,例如:
column file_name format a50
(50 个字母数字符号)