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 个字段开始使用所有字段。
您可以像这样使用 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"*
. 不要尝试这个!