Bash:文件所在目录的名称";开封为;

Bash:文件所在目录的名称";开封为;,bash,directory,open-with,Bash,Directory,Open With,如何将打开脚本的文件的目录(不是完整路径)放入变量中?我假设这与$1相同,所以我希望文件的路径在从终端执行时产生相同的结果 解释 #!/bin/bash script.sh '~/foo/bar/file.ext' #I want to put "bar" into a variable. 当通过GUI以“script.sh”打开“file.ext”时,它也应该工作。向script.sh添加一些代码 echo '$1='"$1" inputFile=$1 inputPath=${i

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

解释

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

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

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

script.sh添加一些代码

 echo '$1='"$1"

 inputFile=$1

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

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

  ...
  $finalDir=bar
这会给你想要的结果吗


我希望这会有所帮助。

在脚本中添加一些代码。sh

 echo '$1='"$1"

 inputFile=$1

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

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

  ...
  $finalDir=bar
这会给你想要的结果吗


我希望这有帮助。

假设您的shell是
/bin/bash

echo $(basename $(dirname $1))

假设您的shell是
/bin/bash

echo $(basename $(dirname $1))

您应该同时签出和程序,
dirname
程序接受一个参数并从路径的其余部分删除程序名。也就是说,它将为您提供目录名

basename
程序的作用正好相反。给定路径名,它将删除所有目录,只保留文件名:

$ dirname /one/two/three/four/five.txt
/one/two/three/four
$ basename /one/two/three/four/five.txt
five.txt
现在,剩下的取决于外壳。在BASH(Linux上的默认shell和您标记的shell)中,您可以使用$(command)语法。这将获取命令的输出并在命令行上替换它。例如:

$ mydirectory=$(dirname /one/two/three/four/five.txt)
$ echo $mydirectory
/one/two/three/four
$ myprog alpha beta gamma delta
在上面的示例中,
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
您还可以将
basename
dirname
命令组合在一起:

$ my_sub_dir=$(basename $(dirname "~/foo/bar/file.ext"))
$ echo $my_sub_dir
$ bar
当shell程序执行时,它会将命令行上的每个参数都放入一个计数变量中。例如:

$ mydirectory=$(dirname /one/two/three/four/five.txt)
$ echo $mydirectory
/one/two/three/four
$ myprog alpha beta gamma delta
在程序
myprog
内部,设置了以下变量:

$1 = "alpha"
$2 = "beta"
$3 = "gamma"
$4 = "delta"
bashshell还有一件事:有一种特殊的过滤器语法来解析变量

  • ${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 |
。您还可以使用它来模拟
basename
dirname
命令:

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

您应该签出和程序,
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和您标记的shell)中,您可以使用$(command)语法。这将获取命令的输出并在命令行上替换它。例如:

$ mydirectory=$(dirname /one/two/three/four/five.txt)
$ echo $mydirectory
/one/two/three/four
$ myprog alpha beta gamma delta
在上面的示例中,
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
您还可以将
basename
dirname
命令组合在一起:

$ my_sub_dir=$(basename $(dirname "~/foo/bar/file.ext"))
$ echo $my_sub_dir
$ bar
当shell程序执行时,它会将命令行上的每个参数都放入一个计数变量中。例如:

$ mydirectory=$(dirname /one/two/three/four/five.txt)
$ echo $mydirectory
/one/two/three/four
$ myprog alpha beta gamma delta
在程序
myprog
内部,设置了以下变量:

$1 = "alpha"
$2 = "beta"
$3 = "gamma"
$4 = "delta"
bashshell还有一件事:有一种特殊的过滤器语法来解析变量

  • ${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 |
。您还可以使用它来模拟
basename
dirname
命令:

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

Bravo@DavidW!:你在写一本书吗?;-)。为了完整起见,我要提到的是,过滤语法在ksh中也可用(当然还有zsh,当然还有其他一些)。如果你运行的脚本是一个符号链接,请小心。使用readlink知道它的真实位置。Bravo@DavidW!:你在写一本书吗?;-)。为了完整起见,我要提到的是,在ksh中也可以使用过滤器语法(当然还有zsh,当然还有其他一些)。使用readlink了解其真实位置。