目前我正在处理此代码:
#!/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的内容都不会被清除,因此之前的字符列表仍然存在。
答案 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
声明进行了两处更改:
添加了-r
选项,以便将反斜杠\
视为普通字符。
默认情况下,read
将从输入中删除前导和尾随空格。为了保留这些空格以便将它们计入输入的字符,IFS
设置为空。 (如果不想要计算此类空格,请将IFS= read -r input
替换为read -r input
。)
参考问题中的脚本:
$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}
的长度。