将脚本的每个单个参数放到一个新行[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是不能存在于参数文本内的(唯一的!)字符(因此可以安全地用于分隔他们)。
哇,非常聪明,只是为了确定它的工作方式,只要有剩余的参数,printf就会运行FORMAT? – Hellfar
完全正确。 –