【问题标题】:How can I retain whitespace in KornShell script when using backticks?使用反引号时如何在 KornShell 脚本中保留空格?
【发布时间】:2012-03-24 05:59:32
【问题描述】:

我正在编写 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

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

提前感谢您的帮助。

【问题讨论】:

    标签: shell unix scripting sqlplus ksh


    【解决方案1】:

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

    您没有向我们展示您如何使用变量 $MY_VAR。如果你说

    echo $MY_VAR > outputFile
    

    你需要引用变量,即

    print -- "$MY_VAR" > outputFile
    

    Print是echo上的ksh major-upgrade,但最好有在命令和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,因为 ! char 被许多 shell 用于表示 !$(上一行的最后一个单词),所以为什么要混淆。

    未来注意事项:您可以在 StackOverflow 上使用 ksh 的标签。 Shell 很模糊,可以表示 Windows cmd.com 和 zsh。

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的快速回答。我需要做的就是在使用变量时将双引号括起来,它解决了我所有的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多