【问题标题】:Create variable BASH command创建变量 BASH 命令
【发布时间】:2013-08-09 19:18:23
【问题描述】:

我尝试自定义一个小 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 命令

【问题讨论】:

标签: bash variables command


【解决方案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"

【讨论】:

  • 很好的尝试用猫替换它。谢谢
【解决方案2】:

工作脚本如下所示:

# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2014-01-28
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多