如何将打开脚本的文件的目录(不是完整路径)放入变量中?我假设这与 $1 相同,所以我希望文件的路径在从终端执行时产生相同的结果。
解释;
#!/bin/bash
script.sh '~/foo/bar/file.ext'
#I want to put "bar" into a variable.
当通过 GUI 使用“script.sh”打开“file.ext”时,它也应该工作。
您应该检查dirname和basename程序,该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 和您标记的内容)中,您可以使用 $(command) 语法。这将获取命令的输出并在命令行上替换它。例如:
$ 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
您还可以将 和命令组合在一起:basename
dirname
$ my_sub_dir=$(basename $(dirname "~/foo/bar/file.ext"))
$ echo $my_sub_dir
$ bar
当 shell 程序执行时,它会将命令行上的每个参数放入一个计数变量中。例如:
$ 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
在上述情况下,模式是*|
。这意味着任何字母组合后跟 a|
在第一个中,最小的匹配是ONE|
。在第二个中,它是ONE|TWO|THREE|
。您还可以使用它来模拟basename
和dirname
命令:
$ myfile="~/foo/bar/file.ext"
$ echo ${myfile%/*} #Like `dirname`
~/foo/bar
$echo ${myfile#*/} #Like `basename`
file.txt
添加一些代码到你的script.sh
echo '$1='"$1"
inputFile=$1
inputPath=${inputFile%/*}
finalDir=${inputPath##*/}
echo '$inputFile='"${inputFile}"
echo '$inputPath='"${inputPath}"
echo '$finalDir='"${finalDir}"
输出
...
$finalDir=bar
这会给你想要的结果吗?
我希望这有帮助。
假设你的外壳是/bin/bash
:
echo $(basename $(dirname $1))