我正在尝试将我的Linux shell脚本设置为从文件中读取(我已经工作),但如果没有任何文件,那么我需要从stdin读取。
读取文件的命令如下所示:
./stats -row test_file
我如何能够阅读用户输入的内容:
./stats -row 4 2 3 5 3 4 5 3 6 5 6 3 4
当我输入这样的命令时,我得到了这样的文件或目录'
我打破了我需要帮助的问题。
#!/bin/sh
INPUT_FILE=$2 #Argument 2 from command line is the input file
exec 5< $INPUT_FILE #assign input file to file descriptor #5
while read -u 5 line #read from file descriptor 5 (input file)
do
echo "$line"
done
exec 5<&- #close file descriptor #5
这对于我需要的输入也不会起作用。
while read line
do
echo "$line"
done <$2
答案 0 :(得分:1)
一个非常巧妙的if
语句可以解决这个问题:
INPUT_FILE=$2 #Argument 2 from command line is the input file
if [ -f "$INPUT_FILE" ]; then
while read -r line
do
echo "$line"
done <"$INPUT_FILE"
else
while read -r line
do
echo "$line"
done
fi
注意:这假设你仍然在寻找文件名作为第二个参数。
我无法理解,但artful
解决方案已在此处得到解答:How to read from file or stdin in bash?
INPUT_FILE=${2:-/dev/stdin} #Argument 2 from command line is the input file
while read -r line
do
echo "$line"
done <"$INPUT_FILE"
exit 0
我选择了这样的解决方案,但错过了stdin
设备/dev/stdin
作为INPUT_FILES
的默认设置。 注意此解决方案仅限于带有proc文件系统的操作系统。
答案 1 :(得分:0)
在bash脚本中,我通常将从文件(或管道)读取的代码放在函数中,其中重定向可以与逻辑分离。
此外,从文件或STDIN读取时,逻辑不关心哪个是最好的。因此,最好将STDIN捕获到临时文件中,然后其余的文件读取代码是相同的。
这是一个从ARG 1或STDIN读取的示例脚本,只计算文件中的行。它还在同一输入上调用wc -l
并显示两种方法的结果。
#!/bin/bash
# default input is this script
input=$0
# If arg given, read from it
if (( $# > 0 )); then
input=$1
echo 1>&2 "Reading from $input"
else
# otherwise, read from STDIN
# since we're reading twice, need to capture it into
# a temp file
input=/tmp/$$.tmp
cat >$input
trap "rm -f $input" EXIT ERR HUP INT QUIT
echo 1>&2 "Reading from STDIN (saved to $input)"
fi
count_lines() {
local count=0
while read line ; do
let count+=1
done
echo $count
}
lines1=`count_lines <$input`
lines2=`wc -l <$input`
fmt="%15s: %d\n"
printf "$fmt" 'count_lines' $lines1
printf "$fmt" 'wc -l' $lines2
exit
这是两个调用:一个在arg 1上有一个文件,另一个没有参数,从STDIN读取:
$ ./t2.sh t2.sh
Reading from t2.sh
count_lines: 35
wc -l: 35
$ ./t2.sh <t2.sh
Reading from STDIN (saved to /tmp/8757.tmp)
count_lines: 35
wc -l: 35