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


11

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

例如,绝对路径可以是:

/home/myusername/folder1/folder2/folder3

它保存在“ target_path”中,我希望“ mydir”只能是:

/folder1/folder2/folder3

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


是调用用户/home/username的实际$HOME目录吗?如果是这样,则可以使用mydir="${target_path#$HOME}"我认为的方法将其删除
steeldriver '16

Answers:


15

使用bash的字符串操作

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

因此,您想要的字符串将是(添加反斜杠):

b="/${a#/*/*/}"

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


该路径可能是30个文件夹,我只想包含最后28个文件夹。这仍然有效吗?
pi

@Lifeofpi为什么不呢?
大师

9

这是一个使用示例 cut

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

folder1/folder2/folder3

如果需要引导/,可以将其附加| sed 's/^/\//'到行尾。

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


7

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

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

在这之后:

echo $myvar

给出:

/folder1/folder2/folder3

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

警告:在使用此方法之前,应检查您的target_path变量是否包含某些字符,并且长度超过两个路径段。例如,如果target_path=/home/username/的话myvar=/。如果您正在运行,可能会对系统造成危险rm -rf "$myvar"*不要尝试这个!


该路径可能是30个文件夹,我只想包含最后28个文件夹。这仍然有效吗?
pi

当然,无论路径多长,这都只会修剪前两个。
Arronical
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.