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

Phi*_*ton 3 unix shell scripting ksh sqlplus

我正在使用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;
!`
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

预先感谢您的帮助.

she*_*ter 5

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

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

echo $MY_VAR > outputFile
Run Code Online (Sandbox Code Playgroud)

你需要引用变量,即

print -- "$MY_VAR" > outputFile
Run Code Online (Sandbox Code Playgroud)

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
)"
Run Code Online (Sandbox Code Playgroud)

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

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

我希望这有帮助.