每当代码完成运行时,重置临时文件的内容

时间:2014-11-09 01:59:13

标签: bash shell unix scripting

目前我正在处理此代码:

#!/bin/sh
echo enter any characters:
read input
$input > file.tmp   
sort file.tmp
echo number of characters entered : 
wc -l file.tmp
exit

基本上我希望用户输入任何字符并计算用户输入的字符数。我将输入存储到临时文件中,以便在代码运行完毕后清除文件内容。但是,每当我再次运行代码时,file.tmp的内容都不会被清除,因此之前的字符列表仍然存在。

2 个答案:

答案 0 :(得分:1)

尝试:

#!/bin/sh
printf '%s' 'enter any characters: '
IFS= read -r input
echo "number of characters entered : ${#input}"

在操作中,这看起来像:

$ sh script.sh
enter any characters: This is a test.
number of characters entered : 15

讨论

read声明进行了两处更改:

  1. 添加了-r选项,以便将反斜杠\视为普通字符。

  2. 默认情况下,read将从输入中删除前导和尾随空格。为了保留这些空格以便将它们计入输入的字符,IFS设置为空。 (如果想要计算此类空格,请将IFS= read -r input替换为read -r input。)

  3. 参考问题中的脚本:

    • $input > file.tmp

      这不会将input的内容写入file.tmp。它告诉shell尝试将input的内容解释为命令并执行它。

    • sort file.tmp

      这将打印file.tmp的已排序内容。它不会以任何方式改变file.tmp

    • wc -l file.tmp

      -l选项告诉wc计算行数。这与声称报告字符数的echo声明冲突。

    • exit

      Shell脚本总是在它们结束时退出。除非您打算为脚本设置返回代码,否则无需显式退出命令。

    • 代码中的任何内容都不会导致file.tmp被删除。要删除它,您需要运行rm file.tmp。如果您想确保删除发生,这可能最好作为trap语句的一部分完成。

答案 1 :(得分:1)

尝试:

#! /bin/bash

IFS= read -rep "Enter characters: " s
echo "${#s} characters entered."

一些解释:-r的{​​{1}}选项是在不解释反斜杠的情况下获取原始输入; read回应了这个问题;并-p使用-e来阅读输入。

为防止readline跳过输入开头和结尾的空格,read将被清空。

IFS扩展到${#s}的长度。