sh中的%~dp0等价

pau*_*que 14 linux shell batch-file

我正在使用sh将一些Windows批处理文件转换为Unix脚本.我有问题,因为某些行为取决于批处理文件中可用的%~dp0宏.

有没有相当于这个?有没有办法获得执行脚本所在的目录?

Sar*_*ien 7

是的你可以!这是在争论中。:)

看着

${0}
Run Code Online (Sandbox Code Playgroud)

将其与

{$var%Pattern}
Remove from $var  the shortest part of $Pattern that matches the back end of $var.
Run Code Online (Sandbox Code Playgroud)

你想要的只是

${0%/*}
Run Code Online (Sandbox Code Playgroud)

我推荐《高级 Bash 脚本指南》 (这也是上述信息的来源)。特别是“将 DOS 批处理文件转换为 Shell 脚本”部分 可能对您有用。:)

如果我误解了您的意思,您可能必须将其与“pwd”的输出结合起来。因为它只包含调用脚本的路径!尝试以下脚本:

#!/bin/bash
called_path=${0%/*}
stripped=${called_path#[^/]*}
real_path=`pwd`$stripped
echo "called path: $called_path"
echo "stripped: $stripped"
echo "pwd: `pwd`"
echo "real path: $real_path
Run Code Online (Sandbox Code Playgroud)

但这需要一些工作。我建议使用 Dave Webb 的方法,除非这是不可能的。


Dav*_*ebb 7

问题(对你而言)$0是它被设置为用于调用脚本的任何命令行,而不是脚本本身的位置.这可能使得很难获得包含脚本的目录的完整路径,这是您%~dp0在Windows批处理文件中获得的.

例如,请考虑以下脚本dollar.sh:

#!/bin/bash
echo $0
Run Code Online (Sandbox Code Playgroud)

如果您运行它,您将获得以下输出:

# ./dollar.sh
./dollar.sh
# /tmp/dollar.sh
/tmp/dollar.sh
Run Code Online (Sandbox Code Playgroud)

因此,要获取脚本的完全限定目录名,请执行以下操作:

cd `dirname $0`
SCRIPTDIR=`pwd`
cd -
Run Code Online (Sandbox Code Playgroud)

其工作原理如下:

  1. cd 使用命令行中的相对路径或绝对路径到脚本目录.
  2. 获取此目录的绝对路径并将其存储在其中SCRIPTDIR.
  3. 使用" cd -" 返回上一个工作目录.

  • 该脚本位于路径中而不是直接调用,然后$ 0将只是脚本的名称,此方法将不起作用. (2认同)