在bash脚本中拆分字符串

Dea*_*tal 1 bash string shell-script filenames

我正在接受用户的一些输入并检查有关的详细信息。

例子:

$HOME/Documents/test/one.txt
Run Code Online (Sandbox Code Playgroud)

我将上面的字符串作为输入并想要检索one.txt,我需要进一步处理one.txt.

jor*_*anm 5

这是一项常见任务,可以通过任何 POSIX shell 中的参数扩展来处理。

path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt
Run Code Online (Sandbox Code Playgroud)

另一种常用方法是使用 basename 程序。

file=$(basename "$path")
Run Code Online (Sandbox Code Playgroud)

唯一的缺点是必须产生一个外部程序。它的主要优点是它可以正确处理带有尾随的路径/

  • 迂腐,`"$(basename "$path")"` 是错误的,万一`$path` 以换行符结尾。这是因为 a) `basename` 在末尾添加了一个额外的换行符,并且 b) `$(command)` 去除了所有尾随的换行符。为了让它工作需要一个反常的解决方法,就像这样:`path=$'/tmp/evil\n'; file="$(basename "$path"; printf x)"; 条=$'\nx'; fixed="${file%%$strip}"` (2认同)

ter*_*don 5

@Jordanm 已经为您提供了适用于任何字符串的规范答案。如果您专门处理路径,您还可以使用程序basenamedirname

   basename - strip directory and suffix from filenames
   dirname - strip last component from file name
Run Code Online (Sandbox Code Playgroud)

例如:

$ file="$HOME/Documents/test/one.txt"
$ dir=$(dirname "$file");
$ name=$(basename "$file");
$ echo "The file called $name is in the directory $dir"
The file called one.txt is in the directory /home/terdon/Documents/test
Run Code Online (Sandbox Code Playgroud)