仅将字符串的一部分分配给 bash 中的变量

Lif*_* pi 11 command-line bash environment-variables

我从用户收到一定绝对的文件路径,我想创建一个变量,会不会只包括一个字符串FIRST文件路径的两个组成部分,但是没有打印出来或任何东西。

例如,绝对路径可以是:

/home/myusername/folder1/folder2/folder3
Run Code Online (Sandbox Code Playgroud)

它保存在“target_path”中,我希望“mydir”仅为:

/folder1/folder2/folder3
Run Code Online (Sandbox Code Playgroud)

我尝试以不同的方式使用 cut 命令,但没有成功。

mur*_*uru 15

使用bash 的字符串操作

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3
Run Code Online (Sandbox Code Playgroud)

所以,你想要的字符串是(加上前导斜杠):

b="/${a#/*/*/}"
Run Code Online (Sandbox Code Playgroud)

对于一个变量a${a#foo}将删除最短的字符串匹配foo开始a。因此,我们删除包含三个的最短字符串/(包括路径中的前导斜杠),以删除绝对路径的前两个组件。


小智 9

这是一个使用示例 cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3
Run Code Online (Sandbox Code Playgroud)

如果您需要领先,/您可以附加| sed 's/^/\//'到您的行尾。

你需要-f4-,因为-d '/'讲述cut使用/作为字段之间的分隔符。所以第一个字段出现在第一个分隔符之前,在这种情况下,第一个字段是空的。folder1第 4 个字段也是如此,并-f4-告诉 cut 从第 4 个字段开始使用所有字段。


Arr*_*cal 7

您可以像这样使用 bash 参数扩展:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"
Run Code Online (Sandbox Code Playgroud)

在这之后:

echo $myvar
Run Code Online (Sandbox Code Playgroud)

给出:

/folder1/folder2/folder3
Run Code Online (Sandbox Code Playgroud)

它的工作原理是/*/*/使用${target_path#pattern}shell 参数扩展语法从 target_path 变量中删除模式的第一个匹配项。不幸的是,这会删除第一个/字符,这就是为什么在设置 myvar 变量时必须明确包含该字符的原因。

警告:在使用此方法之前,您应该检查 target_path 变量是否包含一些字符,并且长度是否超过两个路径段。例如如果target_path=/home/username/,则myvar=/。如果您运行类似rm -rf "$myvar"*. 不要尝试这个!