1

我有一个 SunOS 系统,这使这种情况变得复杂。

我有一些从不同路径运行的脚本(不可避免),并且系统有一个路径结构,路径中包含“系统环境”,然后我可以从路径中提取它。我有一个简单的脚本,它在之前调用或从其他所有脚本获取,以获取环境并设置其他几个公共变量。问题是,现在有 3 个不同的区域可能正在调用这个脚本,它没有正确地从路径中提取环境。

以下是可能存在的 3 条路径的简单示例:

  • /dir1/dir2/${ENV}/bin/script1.ksh
  • /dir1/dir2/${ENV}/services/service_name/script2.ksh
  • /dir1/dir2/${ENV}/services/service_name/log/script3.ksh

我想要 1 个脚本,它能够获得 ${ENV},无论提供了哪一个路径,而不是我目前的 3 个单独的策略。

这是我目前获得第一个 ${ENV} 的方式:

#!/bin/ksh

export BASE_DIR=${0%/*/*}
export ENV=${BASE_DIR##*/}

第二个脚本:

#!/bin/ksh

export CURR_DIR=$( cd -- "$(dirname -- "$(command -v -- "$0")")" && pwd)
export BASE_DIR=${CURR_DIR%/*/*}
export ENV=${BASE_DIR##*/}

正如我所说,这是一个 SunOS 系统,所以它有一个旧的 KSH 受限版本。没有设置 -A 或替换。

关于限制我的脚本重复性的最佳策略的任何想法?

谢谢。

4

1 回答 1

0

从您的示例中可以看出,您的 ${ENV} 目录距离根目录的深度是固定的,在这种情况下,您可以从另一端开始轻松获取目录的名称;

export ENV=`pwd | sed -e "s%\(/dir1/dir2/\)\([^/]*\).*%\2%"`

我正在使用 '%' 所以我可以匹配 '/' 而不会转义。在不知道您使用的是哪个版本的 SunOS/Solaris 的情况下,我无法确定您的 sed 的兼容性如何,但 Bruce Barnett 将它包含在他的教程中,这些教程与后期的 SunOS 和早期的 Solaris 版本非常一致。

如果您的脚本都由同一个用户调用,那么您可能希望将上述内容包含在该用户的 .profile 中,那么 ENV 变量将可供该用户拥有/执行的所有脚本访问。

更新:Lee E. McMahon 的“SED——非交互式文本编辑器” ——写于 1978 年——包括使用转义括号的模式分组,因此它应该适用于 SunOS。:)

于 2014-10-16T00:22:25.663 回答