2016-06-13 82 views
1

我正在将一些批处理脚本转换为bash脚本来在Linux上构建项目,并且我需要将%%~nxD转换为Bash。它用于以下形式:Bash中%%〜nxD的等价物是什么?

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

如果任何人都可以阐明这一点,它将不胜感激。

+7

它在批处理中做了什么? – 123

+0

请问在DOS /批处理中如何使用另一种语言来完成它。 – SaintHax

+0

http://batsh.org提供了在bat-> sh和sh-> bat之间进行转换的一些功能。它将你的'VarName = ....'标记为有语法错误。 *可能*如果你粘贴整个脚本,你会得到更好的结果。祝你好运。 – shellter

回答

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结尾冗余/,它可能无法按预期方式工作。
0

猜测,因为你没有添加它在DOS中所做的,你想要父目录?

var=${PWD%*/} 

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

var=${PWD##/*} 
相关问题