我尝试为特殊的道具定制一个小 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 命令
改用数组形式:
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"
工作脚本如下所示:
# 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