从不同位置逐行读取,请避免重复的代码

问题描述

| 我有以下脚本。
for args 
do 
        while read line; do
                # do something
        done <\"$args\"

done 
如果脚本以文件名列表开头,则应逐行读取每个文件。 现在,我正在寻找一种方法,在启动脚本时从stdin读取文件而没有文件名列表,但是我不想复制while循环。 有任何想法吗?     

解决方法

快速回答:
[[ -z $1 ]] && defaultout=/dev/stdin

for f in \"$@\" $defaultout; do
  while read line; do
    # do something
  done < \"$f\"
done
缺点:未解析参数 第二次尝试:
[[ -z $1 ]] && defaultout=/dev/stdin

for f in $@ $defaultout; do
  if [[ -f $f ]]; then
    while read line; do
      # do something
    done < \"$f\"
  fi
done
缺点:带空格的文件名将解析为两个单词。     ,您可以尝试:
args=\"$*\"
if [ \"$args\" = \"\" ]; then
  args=/dev/stdin;
fi

for arg in $args; do
  while read -r line; do
    # do something
  done < \"$arg\";
done
    ,以下应该做您想要的:
cat \"$@\" | while read line; do
  # something
done