Bash中%% ~nxD的等价物是什么?

时间:2016-06-13 13:23:26

标签: bash batch-file

我正在努力将一些批处理脚本转换为bash脚本以在Linux上构建项目,我需要将%%~nxD转换为Bash。它以下列形式使用:

FOR %%D IN ("%SOURCE_DIR%\..\..") DO SET "ProjName=%%~nxD"

如果有人能够对此有所了解,那将非常感激。

2 个答案:

答案 0 :(得分:3)

FOR %%D IN ("%SOURCE_DIR%\..\..") DO SET "ProjName=%%~nxD"

(假设是找到SOURCE_DIR变量的第三个路径组件。)

在bash中,这可能是这样的:

ProjName=$(basename `(cd $SOURCE_DIR/../..; pwd)`)

cd - 更改为目录pwd - 打印当前目录basename - 获取名称的最后一个组成部分。)

可替换地:

ProjName=$(basename $(dirname $(dirname $SOURCE_DIR)))

(使用dirname删除两个路径组件,然后使用basename获取最后一个组件。)

或者,没有额外的命令(快速,但丑陋):

TEMP1=${SOURCE_DIR%/*/*}
ProjName=${TEMP1##*/}

(与之前相同,但使用bash'内置字符串扩展。搜索man bash ## - 它会直接引导您进行字符串扩展说明。)

选项之间的主要区别是:

  • 第一个是丑陋的,但IME最可靠,并且由于pwd可以用来解析符号链接。 (也允许错误检查。)
  • 第二个模拟../..嵌套dirname来电。
  • 第三个与第二个相同,但更快,因为它不使用命令,而是使用字符串扩展。但它存在一个缺陷,如果$SOURCE_DIR以冗余/结尾,则可能无法正常工作。

答案 1 :(得分:0)

猜猜,因为你没有在DOS中添加你想要父目录的内容吗?

var=${PWD%*/}

如果它是当前目录,则没有路径

var=${PWD##/*}