Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash中%%~nxD的等效值是什么?_Bash_Batch File - Fatal编程技术网

Bash中%%~nxD的等效值是什么?

Bash中%%~nxD的等效值是什么?,bash,batch-file,Bash,Batch File,我正在将一些批处理脚本转换为bash脚本,以便在Linux上构建一个项目,我需要将%%~nxD转换为bash。它以以下形式使用: FOR %%D IN ("%SOURCE_DIR%\..\..") DO SET "ProjName=%%~nxD" 如果有人能解释一下这一点,我们将不胜感激。猜测一下,因为您没有添加在DOS中您想要的父目录是什么 var=${PWD%*/} 如果是当前目录,则没有路径 var=${PWD##/*} (假设这是为了找到SOURCE\u DIR变量的第三个路径组件

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

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

如果有人能解释一下这一点,我们将不胜感激。

猜测一下,因为您没有添加在DOS中您想要的父目录是什么

var=${PWD%*/}
如果是当前目录,则没有路径

var=${PWD##/*}
(假设这是为了找到
SOURCE\u DIR
变量的第三个路径组件。)

在bash中,这可能如下所示:

ProjName=$(basename `(cd $SOURCE_DIR/../..; pwd)`)
cd
-切换到目录,
pwd
-打印当前目录,
basename
-获取名称的最后一个组件。)

或者:

ProjName=$(basename $(dirname $(dirname $SOURCE_DIR)))
(使用
dirname
剥离两个路径组件,然后使用
basename
提取最后一个组件)

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

(与前面相同,但使用bash内置的字符串扩展。搜索
manbash
以查找
##
——它将直接引导您找到字符串扩展描述。)

两种方案之间的主要区别是:

  • 第一个是丑陋的,但IME是最可靠的,多亏了
    pwd
    可以用来解析符号链接。(还允许进行错误检查。)
  • 第二个使用嵌套的
    dirname
    调用模拟
    。/..
  • 第三个与第二个相同,但速度更快,因为它不使用命令,而是使用字符串扩展。但它有一个缺陷,即如果
    $SOURCE\u DIR
    以冗余的
    /
    结尾,它可能无法按预期工作

它在批处理中做什么?当您询问如何使用另一种语言时,请将它在DOS/batch中做什么。提供一些在bat->sh和sh->bat之间转换的功能。它将您的
VarName=..
标记为存在语法错误。也许如果你把整个脚本粘贴到那里,你会得到更好的结果。祝你好运。这是我试图转换的批处理文件中的一行。对于%%D IN(“%SOURCE\u DIR%\..\”)设置“ProjName=%%~nxD”是的,我们猜到了,但需要一个既知道(a)批处理意味着什么,又知道(b)如何在bash中编写它的人-我们认为您至少可以提供其中的前半部分?
ProjName=$(basename $(dirname $(dirname $SOURCE_DIR)))
TEMP1=${SOURCE_DIR%/*/*}
ProjName=${TEMP1##*/}