Bash:文件被“打开”的目录名称

时间:2011-09-16 01:08:37

标签: bash directory open-with

如何将打开脚本的文件的目录(不是完整路径)放入变量?我假设这与$ 1相同,所以我希望文件的路径在从终端执行时产生相同的结果。

解释

#!/bin/bash
script.sh '~/foo/bar/file.ext'

#I want to put "bar" into a variable.

当“file.ext”通过GUI打开“script.sh”时,它也应该有效。

3 个答案:

答案 0 :(得分:4)

你应该检查dirnamebasename程序,dirname程序接受一个参数并从路径的其余部分中删除程序的名称。也就是说,它会为您提供目录名称。

basename计划恰恰相反。给定路径的名称,它将删除所有目录,只留下文件名:

$ dirname /one/two/three/four/five.txt
/one/two/three/four
$ basename /one/two/three/four/five.txt
five.txt

现在,其余的取决于shell。在BASH(它是Linux上的默认shell以及您标记的内容)中,您可以使用$(命令)语法。这将获取命令的输出并将其替换为命令行。例如:

$ mydirectory=$(dirname /one/two/three/four/five.txt)
$ echo $mydirectory
/one/two/three/four

在上面的示例中,dirname命令采用了目录的名称,替换了$()语法中的所有内容,并允许我设置变量mydirectory的名称。

您可以组合使用它们来获得您想要的东西:

$ my_full_dir=$(dirname "~/foo/bar/file.ext")
$ echo $my_full_dir
~/foo/bar
$ my sub_dir=$(basename $my_full_dir)
$ echo $sub_dir
bar

您还可以将basenamedirname命令组合

$ my_sub_dir=$(basename $(dirname "~/foo/bar/file.ext"))
$ echo $my_sub_dir
$ bar

当shell程序执行时,它会将命令行上的每个参数都放入count变量中。例如:

$ myprog alpha beta gamma delta

在程序myprog内部,设置了以下变量:

$1 = "alpha"
$2 = "beta"
$3 = "gamma"
$4 = "delta"

BASH shell还有一件事:有一个特殊的过滤器语法来解析变量。

  • ${variable#pattern} - 左小图案。从变量
  • 的左侧删除最小的模式
  • ${variable##pattern} - 左大图案。从变量
  • 的左侧删除最大的模式
  • ${variable%pattern} - 正确的小图案。从变量
  • 的右侧删除最小的模式
  • ${variable%%pattern} - 正确的大图案。从变量
  • 的右侧删除最大可能的模式

以下是一个例子:

$ FOO="ONE|TWO|THREE|FOUR"
$ echo ${FOO##*|}
FOUR
$ echo ${FOO#*|}
TWO|THREE|FOUR

在上述情况下,模式为*|。这意味着任何字母组合后跟|在第一个中,最小的匹配是ONE|。在第二个中,它是ONE|TWO|THREE|。您还可以使用它来模拟basenamedirname命令:

$ myfile="~/foo/bar/file.ext"
$ echo ${myfile%/*}     #Like `dirname`
~/foo/bar
$echo ${myfile#*/}      #Like `basename`
file.txt

答案 1 :(得分:0)

script.sh

中添加一些代码
 echo '$1='"$1"

 inputFile=$1

 inputPath=${inputFile%/*}
 finalDir=${inputPath##*/}

 echo '$inputFile='"${inputFile}"
 echo '$inputPath='"${inputPath}"
 echo '$finalDir='"${finalDir}"

<强>输出

  ...
  $finalDir=bar

这能为您提供所需的结果吗?

我希望这会有所帮助。

答案 2 :(得分:0)

假设你的shell是/bin/bash

echo $(basename $(dirname $1))