使用已包含'$ 1'的命令制作bash脚本

时间:2015-07-16 23:03:50

标签: bash

在某处我发现这个命令按输入文件的数量(第一顺序)和字母顺序(第二顺序)对输入文件中的行进行排序:

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脚本中使命令工作?

1 个答案:

答案 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"
  • 如果您的目标是编写bash脚本,请使用#!/bin/bash; #!/bin/sh是POSIX sh脚本的shebang,而不是bash。
  • 清除IFS以避免从输入和输出行修剪前导和尾随空格
  • 使用printf而非echo来避免POSIX标准存在歧义(请参阅http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html,尤其是“应用程序使用”和“RATIONALE”部分)。
  • 引用扩展("$1"而不是$1)以防止它们被分词或全局展开

另请注意,这会创建一个新文件,而不是就地操作。如果您想要就地操作的东西,请在最后添加&& mv -- "sorted-$1" "$1"