使用反引号时如何在KornShell脚本中保留空格?

时间:2012-03-06 17:47:35

标签: shell unix scripting sqlplus ksh

我正在使用KornShell(ksh)中的脚本。我的数据库连接是通过SQLPLUS连接到Oracle 9i数据库。我没有任何问题将DB值转换为shell变量,除了任何连续的空格被自动截断为只有一个字符。

以下是我的代码示例:

MY_VAR=`sqlplus -s usr/pass@db << !
set heading off;
set pagesize 0;

select a_value from a_table where an_index = 25;
!`

数据库中的实际数据如下:

Dec 15 09:19:10 <24:0070> User record (5    XATY       41839FG8   58775HK9AFF) is invalid for this condition

我上面的代码示例返回如下:

Dec 15 09:19:10 <24:0070> User record (5 XATY 41839FG8 58775HK9AFF) is invalid for this condition

间距对我正在使用的内容至关重要。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

首先,不要使用反引号,根据1995年出版的“新Kornshell编程语言”,它们已被弃用!相反,请使用易于嵌套的命令替换版本$( yourCmd goes here)

您没有告诉我们您如何使用变量$ MY_VAR。如果你说

echo $MY_VAR > outputFile

你需要引用变量,即

print -- "$MY_VAR" > outputFile

Print是一个关于echo的ksh主要升级,但最好习惯在命令和你想要print的字符串之间使用' - '。您要打印的字符串中的任何“ - ”字符都可以为循环抛出无人看守的(即没有“ - ”),print命令。

您可能还需要将作业引用到MY_VAR,即

MY_VAR="$(sqlplus -s usr/pass@db <<-EOD
set heading off;
set pagesize 0;

select a_value from a_table where an_index = 25;
EOD
)"

我已经切换到EOD了!很多shell都使用char作为符号!$(前一行的最后一个单词),所以为什么要混淆。

注意将来:您可以在StackOverflow上使用ksh的标记。 Shell是不明确的,可能意味着Windows cmd.com以及zsh。

我希望这会有所帮助。