将脚本的每个单个参数放到一个新行[Bash]

问题描述:

解析bash中的文本我经常需要将一组参数转换为输出文件的行。将脚本的每个单个参数放到一个新行[Bash]

举例来说,如果我运行:

theBinaryIamLookingFor "arg1" "arg2" "argument with some words" 

我想有以下输出:

arg1 
arg2 
argument with some words 

我显然需要对大多数分布的原生解决方案,否则我知道如何做到这一点。

我的主要目标是优化和清理通常由循环组成的代码。

这可能是一个愚蠢的问题,但这是地狱,用非常使用的关键字(新行,参数...)在网上搜索。

只使用由POSIX SH标准中规定的功能:

printf '%s\n' "arg1" "arg2" "argument with some words" 

如果你想确保每个参数只打印一行,即使参数包含文字换行,可以考虑使用的bash/ksh/zsh扩展printf %q(这也将使非ASCII字符和其他内容您的终端可能不会呈现可见),格式化内容的方式,外壳将eval回到其原始值:

printf '%q\n' "arg1" "arg2" "argument with some words" 

要了解为什么这很重要,请考虑"arg1" "arg2" "argument with"$'\n'"a newline"


相反,如果你的目标是产生的方式,很容易解析回,最初作为输入给出,但不安全的做法,如eval完全相同的参数列表输出,使用完全无效,而不是换行符带格式字符串'%s\0'的分隔符;这些都是安全的,因为由于命令行参数是以C字符串形式给出的,而C字符串是以NUL分隔的,所以NUL是不能存在于参数文本内的(唯一的!)字符(因此可以安全地用于分隔他们)。

+0

哇,非常聪明,只是为了确定它的工作方式,只要有剩余的参数,printf就会运行FORMAT? – Hellfar

+0

完全正确。 –