gpt4 book ai didi

linux - Bash- Count Newlines 通过终端命令

转载 作者:太空宇宙 更新时间:2023-11-04 11:59:32 25 4
gpt4 key购买 nike

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

例如~$./script.sh

1

2

3

4

(用户按下 CTRL+D)

在此处显示字数 # 答案是 5 - 工作正常

例如~$ .script1.sh < 脚本1.sh

厕所在这里 -(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

最佳答案

#!/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 的变量命令仅存在于大括号内,这是由于 shell(有些 shell)在管道中使用子 shell 命令的方式。通常,解决方案是从进程替换 (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

关于linux - Bash- Count Newlines 通过终端命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53053143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com