Bash提取字符串特定单词报错求助:路径字段提取失败
解决Bash字符串提取的错误问题
我来帮你搞定这个问题!你的代码里有几个小细节出错了,咱们一步步拆解修正:
你的代码里的错误点
- 变量名混淆:你定义的变量是
input,但后面却用了$file,Bash找不到这个未定义的变量,会把它当成空值处理,直接导致语法错误。 - 参数扩展语法错误:
subString= {$file:0:$length}里的空格是致命问题!Bash会把{$file:0:$length}当成一个命令去执行,这就是你看到"No such file or directory"报错的原因。正确的参数扩展语法是${变量名:起始位置:长度},而且赋值时等号两边绝对不能有空格。 - 管道赋值方式错误:
name= $subString | rev | cut -d "/" -f1 | rev这种写法不对,要把管道命令的结果赋值给变量,必须用命令替换$()把整个管道逻辑包裹起来,否则Bash会把$subString当成独立命令执行,再次引发错误。
修正后的原思路代码
如果你想保留原来的逻辑,修正后的代码是这样的:
input="xxx/yyy/zzz/foo.txt" # 计算需要截取的长度:总长度减去最后8个字符("/foo.txt"共8个字符) ((length = ${#input} - 8)) # 正确使用参数扩展截取字符串,变量名用input,去掉多余空格 subString=${input:0:$length} # 用命令替换将管道结果赋值给name name=$(echo "$subString" | rev | cut -d "/" -f1 | rev) echo "$name"
更简洁的实现方式
其实不用这么绕,Bash本身提供了更高效的参数扩展工具,或者用简单的管道就能搞定:
方法1:纯Bash参数扩展(推荐,无需外部命令)
input="xxx/yyy/zzz/foo.txt" # 第一步:去掉最后一个"/"及后面的所有内容,得到 "xxx/yyy/zzz" temp=${input%/*} # 第二步:去掉最后一个"/"及前面的所有内容,得到 "zzz" name=${temp##*/} echo "$name"
方法2:用rev+cut简化管道逻辑
input="xxx/yyy/zzz/foo.txt" # 反转字符串后取第二个字段,再反转回来 echo "$input" | rev | cut -d "/" -f2 | rev
原理:把字符串反转成txt.oof/zzz/yyy/xxx,用cut取第二个分隔后的字段就是zzz,再反转回来结果不变,比你原来的逻辑少一步截断操作。
方法3:用awk直接提取
input="xxx/yyy/zzz/foo.txt" echo "$input" | awk -F '/' '{print $(NF-1)}'
原理:用/做分隔符,NF是总字段数,$(NF-1)就是倒数第二个字段,正好是zzz。
内容的提问来源于stack exchange,提问作者Bhranee
相关产品推荐
相关产品推荐

