所需代码:
echo "$var" | sort -t/ -k 1,1n -k2,2n -k3,3n
案例场景:对根据条件动态创建并存储在变量中的 arr 进行排序的选项。我怎样才能通过他们。
option='-k 1,1n -k2,2n'
echo "$var" | sort -t/ "$option"
或者
echo "$var" | sort -t/ "$(eval echo "$option")
但没有任何作用。抛出杂散字符错误
sort: stray character in field spec: invalid field specification ‘ 1,1n -k 2,2n -k 3,3n’
答案1
以下是一般答案,专门适用于您的问题以及您可能希望在实际使用命令行参数之前将命令行参数存储在变量中的任何其他情况。
您的代码的问题是,当您"$option"
在 的 命令行上使用时sort
,它是一个单身的争论。在这种情况下,您可以通过简单地删除引号并让 shell$option
在空格、制表符和换行符上拆分字符串来解决此问题,然后在调用sort
结果列表之前对这些生成的单词执行文件名通配。这样做适合您的情况,但不是解决问题的一种不太优雅的方式。
它会不太优雅,因为它依赖于$option
在空格上正确分割字符串并且不包含文件名通配模式。
对于更通用的解决方案,将选项和选项参数放在一个数组中;这样,您就可以引用每个需要它的论点。以下代码假定您使用的是支持数组的 shell,例如bash
。
options=( -k 1,1n -k 2,2n -k 3,3n )
sort -t '/' "${options[@]}" <<<"$var"
通过引用 的扩展${options[@]}
,可以确保数组的每个元素options
都扩展为单个字段,这意味着 shell 会扩展数组options
,就好像所有元素都在命令行上单独引用为 的参数一样sort
。
在没有数组的 shell 中,请改用位置参数列表:
set -- -k 1,1n -k 2,2n -k 3,3n
printf '%s\n' "$var" | sort -t '/' "$@"
与截断的第一个代码一样,引用$@
是必不可少的,因为它保证位置参数列表中的每个元素都完整扩展。 shell 在这里也将扩展"$@"
为字段列表,并将这些字段作为参数提供给实用sort
程序。
在任何情况下,您都希望避免使用echo
来输出 的值,$var
因为echo
我会根据 shell 的配置和变量的内容修改数据。
也可以看看:
答案2
请注意,该sort
命令需要接收选项作为单独的参数字符串,即sort
-t/
-k
1,1n
-k2,2n
-k3,3n
。
当您使用双引号扩展(例如 )时"$option"
,所有选项都将作为单个字符串传递,即sort
-t/
-k 1,1n -k2,2n -k3,3n
。
为了避免这种情况,只是不要使用引号大约$option
:
option='-k 1,1n -k2,2n'
echo "$var" | sort -t/ $option
用于排序的选项-k
可以接受字段规范作为同一参数字符串 ( ) 的一部分或作为选项 ( )-k2,2n
后面的下一个参数字符串。如果字段规范是与选项说明符相同的参数字符串的一部分,它甚至可以接受空格:-k
-k
1,1n
echo works | sort -t/ "-k 1,1n" -k2,2n -k3,3n
works
但即使在字段规范之后的同一参数字符串中存在单个空格字符也是不可接受的:
echo fails | sort -t/ "-k 1,1n " -k2,2n -k3,3n
sort: stray character in field spec: invalid field specification ‘ 1,1n ’