我正在尝试制作一个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
答案 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 x
和read x < <(cmd)
的快速演示
$ x=foo; echo bar | read x; echo $x
foo
$ x=foo; read x < <(echo bar); echo $x
bar