为什么我们使用“printf '%s\n'”语句代替“echo”,我对 shell 脚本来说是新的,所以请帮助我理解

为什么我们使用“printf '%s\n'”语句代替“echo”,我对 shell 脚本来说是新的,所以请帮助我理解
secondLarge=`printf '%s\n' "${array[@]}" | sort -n | tail -2 | head -1`

我试图得到第二大的数字,我得到了它,但如果我尝试得到它,echo我就得不到它。帮助我理解

secondLarge=`echo "${array[@]}" | sort -n | tail -2 | head -1`

答案1

当您向 GNU 版本printf(通常安装在/usr/bin/printf)和同名的 Bash 内置命令传递的参数多于%格式字符串中的 -expandos 时,它们的作用都类似于循环。

鉴于:

declare -a array=( a b c )

然后:

printf '%s\n' "${array[@]}"

或多或少相当于:

for x in "${array[@]}"
do
    echo $x
done

上述两者都会产生以下结果:

a
b
c

相比之下:

echo "${array[@]}"

产生这个:

a b c

您的管道对输出进行排序,然后获取倒数第二行。在该printf示例中,数组中的每个元素都打印在自己的行上,因此您最终会获得数组中第二大的数值。如果您使用echo,则只有一行要处理,因此您会得到包含所有数组值的一行。

相关内容