Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 字符串操作:删除路径的最后一个组件_Linux_String_Bash - Fatal编程技术网

Linux 字符串操作:删除路径的最后一个组件

Linux 字符串操作:删除路径的最后一个组件,linux,string,bash,Linux,String,Bash,这是我的密码 real_path="/u1/h7/user/469/code/hw4/b.sh" while [ "$real_path" != "/" ] do echo $real_path real_path=${real_path%/*} done echo $real_path #just to print the root '/' 我希望我的脚本打印以下行,但是real_path=${real_path%/*}似乎不起作用,有什么建议或其他方法来实现这一点吗 /u1/

这是我的密码

real_path="/u1/h7/user/469/code/hw4/b.sh"
while [ "$real_path" != "/" ]
do
  echo $real_path
  real_path=${real_path%/*}
done
echo $real_path   #just to print the root '/' 
我希望我的脚本打印以下行,但是
real_path=${real_path%/*}
似乎不起作用,有什么建议或其他方法来实现这一点吗

/u1/h7/user/469/code/hw4/b.sh
/u1/h7/user/469/code/hw4
/u1/h7/user/469/code
/u1/h7/user/469
/u1/h7/user
/u1/h7
/u1
/
由于您正在使用:

${real_path%/*}
它最终会将
/u1
剥离为一个空字符串,因此
real\u path
永远不会相等
/
,您将运行一个无限循环

要修复,请使用如下代码:

#!/bin/bash

real_path="/u1/h7/user/469/code/hw4/b.sh"

while [[ -n "$real_path" ]]; do
   echo "[$real_path]"
   real_path="${real_path%/*}"
   parent="$real_path/"
done

echo "final: [$parent]";
这将打印:

[/u1/h7/user/469/code/hw4/b.sh]
[/u1/h7/user/469/code/hw4]
[/u1/h7/user/469/code]
[/u1/h7/user/469]
[/u1/h7/user]
[/u1/h7]
[/u1]
final: [/]
试试这个:

real_path="/u1/h7/user/469/code/hw4/b.sh"
while [ "$real_path" != "" ];do 
      echo "$real_path"          
      real_path=${real_path%/*}     
done 

下面是使用awk在
/
上分割路径以实现所需输出的另一种方法:

$ awk -F'/' '{while(NF-->2)print;print FS}' OFS='/' <<<"/u1/h7/user/469/code/hw4/b.sh"
/u1/h7/user/469/code/hw4
/u1/h7/user/469/code
/u1/h7/user/469
/u1/h7/user
/u1/h7
/u1
/

$awk-F'/'{while(NF-->2)print;print FS}'OFS='/'您可以使用
dirname

#! /bin/bash

real_path="/u1/h7/user/469/code/hw4/b.sh"
while [ "$real_path" != "/" ];do
    echo "$real_path"
    real_path=$(dirname "$real_path")
done
echo "$real_path"
输出:

/u1/h7/user/469/code/hw4/b.sh
/u1/h7/user/469/code/hw4
/u1/h7/user/469/code
/u1/h7/user/469
/u1/h7/user
/u1/h7
/u1
/

谢谢我没在想!不管怎样,你建议我如何去一个目录?我希望我的最后一个输出是u1的父目录,它是根目录。不为空…您的
for
循环错误!(如果
real\u path
不包含空格或全局字符,则不提它是无用的,如果它包含空格或全局字符,您将看到它的错误原因)。是的,这可能被视为有点欺骗,就像我可以在结尾打印“/”,但感谢您的回复!我刚刚学会了如何使用awk,谢谢,没有问题。我想问题的出现是因为最终输出是唯一带有尾随斜杠的输出。如果他们都有一个,就有可能以同样的方式对待他们。