Здесь есть ряд проблем. Сначала необходимо проанализировать параметры (цикл getopts), затем удалить их из списка аргументов (с shift $(($OPTIND-1))
), , а затем получить FILE1 и FILE2 из $ 1 и $ 2. Во-вторых, вы должны указать getopts, что -o принимает аргумент (getopts "o:"
). В-третьих, ваш цикл getopts должен включать проверку на недопустимую опцию (и вы, вероятно, также должны убедиться, что были указаны и FILE1, и FILE2). В-четвертых, при проверке, является ли $ outputfile пустым, вам нужно заключить его в двойные кавычки, а затем использовать строковый тест (-eq проверяет равенство чисел и выдает ошибку, если вы используете его для сравнения чего-либо, кроме чисел). В-пятых, вы должны иметь двойные кавычки вокруг имен файлов на случай, если в них есть забавные символы. Наконец, фактические команды, которые вы пытаетесь выполнить (вставка, tr и т. Д.), Не имеют смысла (поэтому я в значительной степени оставил их в покое). Вот мой снимок при переписывании:
#!/bin/sh
outputfile=''
while getopts "o:" OPTION
do
case $OPTION in
o)
outputfile="$OPTARG"
;;
[?])
echo "Usage: $0 [-o outfile] file1 file2" >&2
exit 1
;;
esac
done
shift $(($OPTIND-1))
if [ $# -ne 2 ]; then
echo "Usage: $0 [-o outfile] file1 file2" >&2
exit 1
fi
FILE1="$1"
FILE2="$2"
if [ -n "$outputfile" ]; then
cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n" | paste "$FILE1" "$FILE2" | tr '\t' '\n' > "$outputfile"
else
cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n"
paste "$FILE1" "$FILE2" | tr '\t' '\n'
fi