在某处我发现这个命令按输入文件的数量(第一顺序)和字母顺序(第二顺序)对输入文件中的行进行排序:
while read -r l; do echo "${#l} $l"; done < input.txt | sort -n | cut -d " " -f 2- > output.txt
它工作正常,但我想在bash脚本中使用该命令,其中要排序的文件的名称是一个参数:
& cat numbersort.sh
#!/bin/sh
while read -r l; do echo "${#l} $l"; done < $1 | sort -n | cut -d " " -f 2- > sorted-$1
输入numbersort.sh input-txt
并未提供所需的结果,可能是因为$ 1已用作其他内容的参数。
如何在shell脚本中使命令工作?
答案 0 :(得分:2)
当使用不涉及引用问题的简单参数时,原始脚本没有任何问题。也就是说,以下版本中存在一些错误:
#!/bin/bash
while IFS= read -r line; do
printf '%d %s\n' "${#line}" "$line"
done <"$1" | sort -n | cut -d " " -f 2- >"sorted-$1"
#!/bin/bash
; #!/bin/sh
是POSIX sh脚本的shebang,而不是bash。printf
而非echo
来避免POSIX标准存在歧义(请参阅http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html,尤其是“应用程序使用”和“RATIONALE”部分)。"$1"
而不是$1
)以防止它们被分词或全局展开另请注意,这会创建一个新文件,而不是就地操作。如果您想要就地操作的东西,请在最后添加&& mv -- "sorted-$1" "$1"
。