我正在尝试在 bash 中执行文本文件的特定行。我想知道是否可以在不将该行复制到新文件中并执行它的情况下做到这一点?
答案1
基于@kev的答案(无需管道传输到新的bash
):获取他的脚本源
script.sh
echo hello
echo world
echo foo
echo bar
并执行里面的某一行$(...)
:
命令:
$(sed -n '3p' script.sh)
它将foo
在bash中打印您当前的 shell。
答案2
script.sh
echo hello
echo world
echo foo
echo bar
命令:
sed -n '3p' script.sh | bash
它将打印foo
答案3
如果你正在谈论 shell 脚本,你可以像本例中那样做:
#!/bin/bash
LINE='less'
#...
LINE="$LINE myfile.txt"
# now we execute that:
$LINE
另一个示例包括捕获输出以进行进一步处理:
#!/bin/bash
LINE="grep foo bar.txt"
OUTPUT=$($LINE)
在第二个示例中,变量$OUTPUT
包含执行命令的结果grep
。
答案4
你可以但可能不应该。创建一个包含函数的库并获取它的源代码。这是一个非常不寻常的要求。Bash 有实际的控制流手段 - 不需要从文件中抓取代码字符串来执行。这可能很危险。
这是一个“玩具”示例,不适用于生产用途......
#!/usr/bin/env bash
shopt -s extglob
# evalLine filepath line-number
evalLine() {
[[ -f $1 && $2 == +([[:digit:]]) ]] || return 1
local x
# This subtraction compensates for a bug that's since been fixed in 4.2.35
mapfile -ts $(($2 - 1)) -n 1 x &&
${x:+eval "$x"}
} <"$1"
evalLine /dev/stdin "$1" <<"EOF"
echo "line 1"
f() { echo "$1"; }; f "line 2"
var3='line 3' eval 'echo "$var3"'
EOF
后期编辑:请注意关于 中的一个错误的评论mapfile
。