Bash-通过终端命令计数换行

时间:2018-10-29 20:13:30

标签: linux bash macos shell

我正在尝试制作一个bash脚本来计算输入中的换行符。第一个if语句(开关$ 0)可以正常工作,但是我遇到的问题是试图使它读取终端参数中文件的WC。

例如 〜$ ./script.sh

1

2

3

4

(用户按CTRL + D)

在这里显示字数#答案是5-很好

例如 〜$ .script1.sh

WC在这里-(5)

〜$成功从文件重定向标准输入

但是 例如 〜$ ./script1.sh script1.sh script2.sh

此处显示的是script1.sh的WC

此处显示的是script2.sh的WC

一无所有

〜$

我相信的问题是第二个if语句,而不是在终端中执行脚本,而是转到if语句并等待用户输入并且不回显echo语句。

任何帮助将不胜感激,因为我无法弄清楚为什么没有〜$ <运算符将无法正常工作。

#!/bin/bash
#!/bin/sh

read filename ## read provided filename
USAGE="Usage: $0 $1 $2..." ## switch statement

if [ "$#" == "0" ]; then  
    declare -i lines=0 words=0 chars=0
    while IFS= read -r line; do
    ((lines++))
    array=($line)               
    ((words += ${#array[@]}))
    ((chars += ${#line} + 1))   # add 1 for the newline
done < /dev/stdin
fi
echo "$lines $words $chars $filename" ## filename doesn't print, just filler

### problem if statement####
if [ "$#" != "0" ]; then # space between [] IS VERY IMPORTANT
    declare -i lines=0 words=0 chars=0
    while IFS= read -r line; do
    lines=$( grep -c '\n'<"filename") ##should use grep -c to compare only new lines in the filename. assign to variable line
    words=$( grep -c '\n'<"filename")
    chars=$( grep -c '\n'<"filename")
echo "$lines $words $chars"
 #lets user press CTRL+D to end script and count the WC
fi

2 个答案:

答案 0 :(得分:0)

使用str_list_node *tail

也许最简单的方法是用wc替换第二个if块。

for

答案 1 :(得分:0)

#!/bin/sh
set -e
if [ -t 0 ]; then
    # We are *not* reading stdin from a pipe or a redirection.
    # Get the counts from the files specified on the cmdline
    if [ "$#" -eq 0 ]; then
        echo "no files specified" >&2
        exit 1
    fi
    cat "$@" | wc
else
    # stdin is attached to a pipe or redirected from a file
    wc
fi | { read lines words chars; echo "lines=$lines words=$words chars=$chars"; }

read命令中的变量仅存在于大括号内,这是由于外壳(无论如何还是某些外壳)将子外壳用于管道中的命令的方式所致。通常,解决方案是从进程替换(bash / ksh)重定向。

可以将其压缩为

#!/bin/bash
[[ -t 0 ]] && files=true || files=false
read lines words chars < <({ ! $files && cat || cat "$@"; } | wc) 
echo "lines=$lines words=$words chars=$chars"

cmd | read xread x < <(cmd)的快速演示

$ x=foo; echo bar | read x; echo $x
foo
$ x=foo; read x < <(echo bar); echo $x
bar