ahmet alp balkan Asked: 2019-03-09 20:57:15 +0800 CST2019-03-09 20:57:15 +0800 CST 2019-03-09 20:57:15 +0800 CST 如何在不添加空格的情况下将bash中的字符串参数拆分为多行 772 我正在运行以下命令: some_command --flag "foo\ bar\ quux" arg2 这会导致字符串作为foo\tbar\tquux. 我正在寻找一种方法来传递此参数而无需制表符(或添加其他空白字符),同时保持缩进(以使我的脚本可读)。 shell arguments 2 个回答 Voted Best Answer godlygeek 2019-03-09T22:32:44+08:002019-03-09T22:32:44+08:00 some_command --flag "$(printf '%s' foo\ bar\ quux)" arg2 会这样做,虽然它不是最易读的。它将“foo”、“bar”和“quux”作为参数传递给printf命令,并%s作为格式字符串。当给定的格式字符少于参数时,格式字符串会根据需要重复,使其等效于%s%s%s,或者所有三个字符串一个接一个地打印,它们之间没有空格。最后,printf命令的输出“foobarquux”被替换为some_command. Kusalananda 2019-03-10T00:35:18+08:002019-03-10T00:35:18+08:00 使用辅助函数: concat () ( IFS= printf '%s' "$*" ) printf '"%s"\n' "$(concat "foo" \ "bar" \ "baz" )" 这将输出 "foobarbaz" 或者,首先将参数的字符串位放入数组中,然后单独创建实际参数(假设使用具有数组的外壳): concat () ( IFS= printf '%s' "$*" ) args=( "foo" "bar" "baz" ) concat_args=$( concat "${args[@]}" ) printf '"%s"\n' "$concat_args" 与上面的 POSIX shell 相同: concat () ( IFS= printf '%s' "$*" ) set -- \ "foo" \ "bar" \ "baz" concat_args=$( concat "$@" ) printf '"%s"\n' "$concat_args" 请注意,concatexectues 的函数体在其自己的子 shell 中(这就是执行的(...)操作),这意味着更改IFS是函数的本地更改。 "$*"使用而不是"$@"在函数中的理由纯粹是为了美观。将"$*"扩展为将打印的单个字符串。printf在这种情况下,实际的连接是由$*没有分隔符(空$IFS)的 shell 扩展来执行的。相反,使用"$@"将扩展到多个单独的字符串,这些字符串printf将重复应用其格式字符串。在这种情况下,连接将是使用特定格式字符串的副作用printf。 或者,同样的想法(单独创建实际的参数字符串)但没有那个辅助函数, arg=\ "foo"\ "bar"\ "baz" printf '"%s"\n' "$arg" printf '"%s"\n'以上将在所有情况下被您的some_command --flag.
会这样做,虽然它不是最易读的。它将“foo”、“bar”和“quux”作为参数传递给
printf
命令,并%s
作为格式字符串。当给定的格式字符少于参数时,格式字符串会根据需要重复,使其等效于%s%s%s
,或者所有三个字符串一个接一个地打印,它们之间没有空格。最后,printf
命令的输出“foobarquux”被替换为some_command
.使用辅助函数:
这将输出
或者,首先将参数的字符串位放入数组中,然后单独创建实际参数(假设使用具有数组的外壳):
与上面的 POSIX shell 相同:
请注意,
concat
exectues 的函数体在其自己的子 shell 中(这就是执行的(...)
操作),这意味着更改IFS
是函数的本地更改。"$*"
使用而不是"$@"
在函数中的理由纯粹是为了美观。将"$*"
扩展为将打印的单个字符串。printf
在这种情况下,实际的连接是由$*
没有分隔符(空$IFS
)的 shell 扩展来执行的。相反,使用"$@"
将扩展到多个单独的字符串,这些字符串printf
将重复应用其格式字符串。在这种情况下,连接将是使用特定格式字符串的副作用printf
。或者,同样的想法(单独创建实际的参数字符串)但没有那个辅助函数,
printf '"%s"\n'
以上将在所有情况下被您的some_command --flag
.