我正在尝试打印最后一个目录,如下所示
#!/bin/bash
dirc="/a/b/"
i=3
`echo "$dirc" | awk -F / '{ print ""$"i"}'`
应该打印“b”,但没有发生。
答案1
i
AWK脚本中是AWK变量,而不是shell变量;您需要设置 AWK 变量:
#!/bin/bash
dirc="/a/b/"
echo "${dirc}" | awk -F / -v i=3 '{print $i}'
i
您可以以 shell 能够理解的任何方式指定 的值:
i=3
echo "${dirc}" | awk -F / -v "i=${i}" '{print $i}'
你可以还可以让 shell 来计算 AWK 脚本中的变量,但这只是自找麻烦:
i=3
echo "${dirc}" | awk -F / "{print \$${i}}"
答案2
你可以使用 shell 的字符串操作在不调用外部实用程序的情况下获取目录的最后一部分:
dirc="/a/b/"
dirc=${dirc%/} # remove trailing / if it is there
echo "${dirc##*/}" # remove everything up to the last /
哪个输出b
.请注意,如果dirc
是 just ,这将不起作用/
,因此basename
可能会更好。
或者通过数字获取一个字段贝壳阵列。
IFS=/ read -a dira <<< "$dirc" # split to an array
echo "${dira[2]}" # echo one field, first is 0
顺便说一句,您echo | awk
命令中的反引号肯定是一个拼写错误吗?使用它们,shell 会将 awk 的输出作为要运行的命令。
答案3
要打印路径的最后一部分,请使用basename
:
$ dirc='/a/b/'
$ basename "$dirc"
b
要/
使用 获取第 i 个分隔字段awk
,请将awk
变量设置为 的值,var
例如,$i
然后使用$var
inawk
访问第 i 个字段:
$ i=3
$ echo "$dirc" | awk -v var="$i" -F '/' '{ print $var }'
b
var
和$var
in之间的区别awk
在于,var
是一个数值(在本例中),而$var
是与该数值对应的字段的值。
正如 ilkkachu 所指出的,代码中最后一行的反引号没有意义。它将导致命令的结果(字符串b
)被解释为将要执行的命令。