0

我尝试为特殊的道具定制一个小 BASH 脚本。

当需要将命令分配给变量时,我对 BASH 脚本感到困惑。

我的破代码:

if [ -n "$2" ]
then
    top=`| head -n $2`
fi
awk '{print $17, ">", $19;}' $logs_folder$i | sort -g | uniq -c | sort -r -g $top

所以默认情况下它返回所有行,但如果用户指定了一个数字,它将添加 head 命令

4

2 回答 2

1

改用数组形式:

if [ -n "$2" ]
then
    top=(head -n "$2")
else
    top=(cat)
fi
awk '{print $17, ">", $19;}' "$logs_folder$i" | sort -g | uniq -c | sort -r -g | "${top[@]}"

并尝试添加更多引号(“”)。

实际上,您无法将管道保存到变量并让 bash 在扩展时以正常方式对其进行解析,但是您可以将其替换为另一个命令(cat)。

您实际上可以使用 eval 但它非常微妙:

if [ -n "$2" ]
then
    top="| head -n \"\$2\""
fi
eval "awk '{print $17, \">\", \$19;}' \"\$logs_folder\$i\" | sort -g | uniq -c | sort -r -g $top"
于 2013-08-09T19:23:56.007 回答
0

工作脚本如下所示:

# set propper default value
top=""
if [ -n "$2" ]
then
    # use double quotes instead of back-tics
    # back-tics are for command substitution
    # but you need the command itself as a string
    top="| head -n $2"
fi

awk '{print $17, ">", $19;}' "$logs_folder$i" | sort -g | uniq -c | sort -r -g $top
于 2013-08-09T19:23:13.467 回答