这是我收到的错误,它失败是因为一个变量的值应该是 2 (我使用 a 得到这个select * from tabel
)。我在该变量中得到了空格。
+ 0 !=
2
./setjobs[19]: 0: not found.
如何从该变量中删除所有这些空格或换行符?可以tr
,,,sed
或者有什么帮助吗?
这就是我正在做的:
set_jobs_count=$(echo "set heading off;
select count(*) from oppar_db
where ( oppar_db_job_name, oppar_db_job_rec ) in ($var) ;" | \
sqlplus -s ${OP_ORA_USER}/${OP_ORA_PASS}@$OPERATIONAL_DB_NAME)
这按建议工作:
| sed 's/[[:space:]]//g'
但我仍然获得如下值:
set_jobs_count=
2
答案1
在输出中留下换行符的原因sed 's/[[:space:]]//g'
是因为数据sed
一次呈现为一行。因此,替换不能替换数据中的换行符(它们根本不是所sed
看到的数据的一部分)。
相反,您可以使用tr
tr -d '[:space:]'
这将删除空格字符、换页符、换行符、回车符、水平制表符和垂直制表符。
答案2
在 ksh、bash 或 zsh 中:
set_jobs_count=…
set_jobs_count=${set_jobs_count//[[:space:]]/}
在任何类似 Bourne 的 shell 中,您可以删除前导和尾随空格,并将所有中间空格标准化为单个空格,如下所示:
set -f
set -- $set_jobs_count
set_jobs_count="$*"
set +f
set -f
关闭通配符;如果您知道数据不包含任何字符\[?*
,则可以省略它。
假设$IFS
包含其默认值空格、制表符、换行符。其他空白字符(CR、VT、FF...)保持不变。
答案3
正如已经建议的,使用“tr -d '[:space:]'”,但如果这不起作用,可能在较旧的 Unix 系统上,需要覆盖所有这些字符:
\011 HT '\t' (horizontal tab)
\012 LF '\n' (new line)
\013 VT '\v' (vertical tab)
\014 FF '\f' (form feed)
\015 CR '\r' (carriage ret)
\040 SPACE ' ' (space)
有了这个:
tr -d '\011\012\013\014\015\040'
但是,也许还有其他不可见的字符混淆了输出,“select count(*) ...”的结果应该只是一个整数,因此只留下数字:
tr -dc '0-9'
但是,如果第一个数字后面还有其他字符,然后是更多数字,则该方法将不起作用。因此,只返回找到的第一个数字序列:
perl -ane '/\d+/ && print($&) && exit'
## example: will return '11', but raw output looks like '22 33'
(echo -e '\a11\b\b22 33') | perl -ane '/\d+/ && print($&) && exit'
答案4
有一个更简单的方法 - 使用(任何)shell分词。
让我们创建一个这样的脚本:
#!/bin/bash
readonly CONN="${RDS_ADMIN}@//${RDS_HOST}/${RDS_DBNAME}"
SCN=$(sqlplus -S $CONN << EOF
SET HEADING OFF
SELECT CURRENT_SCN FROM V\$DATABASE;
EOF
)
echo ">>>$SCN<<<"
SCN=$(echo $SCN)
echo ">>>$SCN<<<"
这是脚本的输出:
oracle@ctrl-dev|265$ ./t.sh
>>>
87401840<<<
>>>87401840<<<
oracle@ctrl-dev|266$
不需要外部命令,缺点是VAR=$(echo $VAR)
结构看起来不太好。