【发布时间】:2015-10-08 06:19:24
【问题描述】:
我想在变量中提取通过 shell 脚本运行的命令的输出,但我无法做到。我正在使用grep 命令。请帮助我在变量中获得所需的输出。
x=$(pwd)
pw=$(grep '\(.*\)/bin' $x)
echo "extracted is:"
echo $pw
pwd 命令的输出是/opt/abc/bin/,我只想要/root/abc 的一部分。提前致谢。
【问题讨论】:
我想在变量中提取通过 shell 脚本运行的命令的输出,但我无法做到。我正在使用grep 命令。请帮助我在变量中获得所需的输出。
x=$(pwd)
pw=$(grep '\(.*\)/bin' $x)
echo "extracted is:"
echo $pw
pwd 命令的输出是/opt/abc/bin/,我只想要/root/abc 的一部分。提前致谢。
【问题讨论】:
使用dirname 获取路径,而不是路径的最后一段。
【讨论】:
/opt/abc/bin: is a directory。
grep 命令。 grep 需要一个文件而不是目录。
你可以使用:
x=$(pwd)
pw=`dirname $x`
echo $pw
或者简单地说:
pw=`dirname $(pwd)`
echo $pw
【讨论】:
echo "$pw".
您正在做的所有事情都可以在一个 echo 中完成:
echo "${PWD%/*}"
$PWD 变量代表当前目录,%/* 删除最后一个/ 和最后一个/ 之后的部分。
对于您的情况,它将输出:/root/abc
【讨论】:
grep 的第二个(以及任何后续)参数是要搜索的文件的名称,而不是要执行匹配的字符串。
此外,grep 打印匹配行或(使用-o)匹配字符串,而不是捕获的括号。为此,您需要一个不同的工具。
最低限度地修复您的代码
x=$(pwd)
pw=$(printf '%s\n' "$x" | sed 's%\(.*\)/bin.*%\1%')
(如果你只关心 Bash,而不关心其他 shell,你可以在没有显式管道的情况下使用 sed ... <<<"$x";语法也更令人满意。)
当然,shell 内置了基本的字符串操作函数。
pw=${x%/bin*}
【讨论】: