我有一个变量
var=/usr/local/bin/test/exec
现在我必须删除上面变量中的最后 2 个路径组件:
var=/usr/local/bin/
删除最后 2 个字符串后,我必须在 shell 循环中使用此变量“var”。
我尝试过:
var='/usr/local/bin/test/exec'
echo ${var#$(dirname "$(dirname "$s")")/}
输出:
test/exec
我得到了截断的部分作为输出,但我期待的是该部分的其余部分,而不是截断的部分。
您可能对 shell 的内部子字符串处理运算符感兴趣:
%
、%%
、#
和 ##
。观察:
#!/bin/sh
var=/usr/local/bin/test/exec
# use shell substring processing to cut the variable down to size:
var="${var%/*}"
var="${var%/*}"
echo "$var"
# Manipulate the resulting string in a loop
for i in 1 2 3
do echo "${var}${i}"
done
如果您不知道字段数,有一个标准的
awk
解决方案。 不过,我将使用 rev
展示另一个技巧
var='/usr/local/bin/test/exec'; echo $var | rev | cut -d/ -f3- | rev
会给
/usr/local/bin
这个方法你也可以试试
var=/usr/local/bin/test/exec
sed 's_\(.*\)/.*/.*$_\1_' <<< $var
另一种方法
sed 's_\(.*\)\(/.*\)\{2\}$_\1_' <<< $var
输出:
/usr/local/bin
这是当路径段数量未知时使用
awk
的解决方案。
> echo '/usr/local/bin/test/exec' | awk 'NF{NF-=2}1' FS='/' OFS='/'
/usr/local/bin
好吧,经过一番谷歌搜索后,我找到了解决方案:
var1="$(echo $var | cut -d '/' -f-4)"