Bash - 有时只创建空输出

时间:2014-11-10 12:12:45

标签: bash output

我正在尝试创建一个接受第一个参数的bash字典脚本并创建以此命名的文件,然后脚本接受下一个参数(这是同一文件夹中的文件)并将其内容输出到文件中(第一个参数)。它还排序,删除符号等,但主要问题是,有时ouptut文件是空的(我传递一个非空文件和一个非现有文件),删除和运行脚本几次后,它有时是空的有时不是。

#!/bin/bash

numberoffileargs=$(( $# - 1 ))
exitstat=0
counterexit=0
acceptingstdin=0;
> "$1";
#check if we have given input files given
if [ "$#" -gt 1 ]; then
    #for cycle going through input files
    for i in "${@:2}"
        do
    #check whether input file is readable
            if [ -r "${i}" ]; then
                cat "${i}" >> "$1"      
    #else redirect to standard output
            else
            exitstat=2
            counterexit=$((counterexit + 1))
            echo "file does not exist" 1>&2
            fi
       done 
else
    echo "stdin code to be done"
    acceptingstdin=1
        #stdin input to output file
#stdin=$(cat)
fi
    #one word for each line, alphabetical sort, alphabet only, remove duplicates
#all lowercase
#sort -u >> "$1"



if [ "$counterexit" -eq "$numberoffileargs" ] && [ "$acceptingstdin" -eq 0 ]; then 
    exitstat=3
fi
cat "$1" | sed -r 's/[^a-zA-Z\-]+/ /g' | tr A-Z a-z | tr ' ' '\n' | sort -u | sed '/^$/d'     > "$1"
echo "$numberoffileargs"
echo "$counterexit"
echo "$exitstat"
exit  $exitstat

1 个答案:

答案 0 :(得分:0)

这是您的脚本,其中包含一些语法改进。你的麻烦来自这样一个事实,即字典在你的管道输入和输出上;我添加了一个临时文件来修复它。

#!/bin/bash

(($# >= 1)) || { echo "Usage: $0 dictionary file ..." >&2 ; exit 1;}
dict="$1"
shift

echo "Creating $dict ..."
>| "$dict" || { echo "Failed." >&2 ; exit 1;}

numberoffileargs=$#
exitstat=0
counterexit=0
acceptingstdin=0

if (($# > 0)); then
    for i ; do
        #check whether input file is readable
        if [ -r "${i}" ]; then
            cat "${i}" >> "$dict"
        else
            exitstat=2
            let counterexit++
            echo "file does not exist" >&2
        fi
    done 
else
    echo "stdin code to be done"
    acceptingstdin=1
fi

if ((counterexit == numberoffileargs && acceptingstdin == 0)); then 
    exitstat=3
fi

sed -r 's/[^a-zA-Z\-]+/ /g' < "$dict" | tr '[:upper:]' '[:lower:]' | tr ' ' '\n' | 
sort -u | sed '/^$/d' >| tmp$$

mv -f tmp$$ "$dict"

echo "$numberoffileargs"
echo "$counterexit"
echo "$exitstat"
exit  $exitstat

管道可能会得到改善。