【问题标题】:From bash to ksh从 bash 到 ksh
【发布时间】:2014-11-18 08:16:46
【问题描述】:

是否有任何教程可以了解如何将代码从 bash 转换为 ksh?用korn怎么写这行代码?

export TYPE_CANAL=$(echo $TYPE | sed "s/${TYPE_APACHE// /\\|}//g")

最后编辑:

行码说明:

如果 TYPE_APACHE 是“abc bcd”,那么 ${TYPE_APACHE// /\|} 将是“abc\|bcd”。使用双 // 的变量扩展是用 \|

全局替换“”(空格字符)

我有两个变量($TYPE 和 $TYPE_APACHE)。 $TYPE_APACHE 中的所有值都包含在 $TYPE 中。 我想要一个名为 TYPE_CANAL_TMP 的新变量,其中的所有值都不包括 $TYPE_APACHE 中的值。

【问题讨论】:

  • 我不知道 KornShell。但是 KornShell 与 Bash 兼容,您是否更改了 #!Shebang?
  • @johnnyevolunium ksh 和 Bash 不相互兼容。 ksh 中没有 Bash-only 功能,反之亦然。

标签: bash shell ksh


【解决方案1】:

您的命令没有正确引用$TYPE,因此它会将任何空格压缩到单独的空格中。这是故意的吗?我假设不是,并且也更改了那部分代码。

该命令将占用$TYPE_APACHE 中的任何空格并将其替换为\\|,然后将其传递给sed 作为要删除的字符串的正则表达式。这可以通过便携方式完成

TYPE_CANAL=$(echo "$TYPE" | sed "s/$(echo "$TYPE_APACHE" | sed 's/ /\\|/')//g")
export TYPE_CANAL

在 Bash 中,这可以用数组更优雅地完成,ksh 也支持数组,但是如果没有正确描述这段代码应该解决的问题,我们需要的地方太多了必须猜。

【讨论】:

    【解决方案2】:

    下次请发布示例输入和输出。我认为您想要以下内容:

    TYPE="a1 a2 a3 a4 a5 a6"
    TYPE_APACHE="a2 a4 a5"
    
    TYPE_CANAL_RAW=""
    for type in ${TYPE}; do
       echo ${type}
       if [[ ${TYPE_APACHE} != *${type}* ]]; then
          TYPE_CANAL_RAW="${TYPE_CANAL_RAW} ${type}"
       fi
    done
    TYPE_CANAL=${TYPE_CANAL_RAW# }
    

    我认为你应该从上面的代码中创建一个函数而不是尝试 避免for循环。 当你真的需要改变它时,你必须让 sed 字符串看起来像

    echo ${TYPE} | sed -e 's/a2//' -e 's/a4//' -e 's/a5//' -e 's/  */ /g'
    

    当您尝试使用 sed 时,请注意 TYPE_ARCHIVE 中的特殊字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2011-02-15
      • 2011-09-30
      • 2021-04-27
      • 2013-10-21
      相关资源
      最近更新 更多