невозможно прочитать файл в цикле - PullRequest
0 голосов
/ 20 мая 2019

У меня есть следующий код:

#!/bin/bash

. ~/.bash_profile

dt=$(date +"%Y.%m.%d")

if [[ "$#" -eq '0' ]] || [[ "$#" -eq '1' ]]
then
echo -e "Not correct usage"
exit 1
fi

tar zvxf $SHARE/*.gz -C $SHARE/landing/

sleep 3

ops () {
//
some sets of command
//
}

while read -r line
do
if [[ "$1" == "A" ]] || [[ "$1" == "B" ]] || [[ "$1" == "C" ]] && [[ "$2" =~ "$line" ]] || [[ "$2" == "ALL" ]]
then
ops
fi
done < $SHARE/landing/dir/ApprovedList."$1"

Когда я запускаю скрипт, я вижу, что он может распаковать файл .gz и поместить его в папку: $SHARE/landing/

Но я думаю, что он не может прочитать файл и выполнить операции внутри функции ops, ниже приводится последняя строка вывода, который я получаю после запуска сценария в интерактивном режиме:

+ read -r line

Любая помощь приветствуется !!!

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Пожалуйста, покажите формат ввода, формат аргумента и некоторые пояснения к ним.А пока подправлен для удобства чтения и обработки ошибок - отредактируйте по вкусу.YMMV.

#!/bin/bash

. ~/.bash_profile

ops () {  # do some stuff
  : some sets of commands ...
}

die() {
  printf "%s\n\n Use: $0 x y z ...\n\n" "$1" >&2
  kill -term $$ # exit in function behaves like return
}

# dt=$(date +"%Y.%m.%d") # unused

case "$#" in
0|1) die "Insufficient arguments" ;;
esac

tar zvxf "$SHARE"/*.gz -C "$SHARE/landing/" || die "tar failed"

sleep 3
infile="$SHARE/landing/dir/ApprovedList.$1"
[[ -e "$infile" ]] || die "$infile does not exist"
[[ -r "$infile" ]] || die "$infile is nor readable by $0 as $LOGNAME"
while read -r line
do case "$1" in
   A|B|C) case "$2" in
          *"$line"*|ALL) ops ;;
                      *) : data does not match, skipping ;;
          esac ;;
       *) die "Invalid arg1 '$1'";;
   esac
done < "$infile"

Примечания:

Если вам требуется точно 2 аргумента, то давайте проверим именно это:

die() {
  printf "%s\n\n Use: $0 x y\n\n" "$1" >&2
  kill -term $$ # exit in function behaves like return
}

и

case "$#" in
2) ;;
*) die "Incorrect # of arguments" ;;
esac

Также, лучше, чем kill - добавьте trap вверху:

trap 'echo >&2 "ERROR in $0($BASH_SOURCE) at line $LINENO: [$BASH_COMMAND]"; exit $LINENO;' ERR

и используйте буквальную ошибку, возвращаемую в функцию.

die() {
  printf "%s\n\n Use: $0 x y\n\n" "$1" >&2
  return 1
}
0 голосов
/ 20 мая 2019

Чек (кроме [[ "$2" =~ "$line" ]])

if [[ "$1" == "A" ]] || [[ "$1" == "B" ]] || [[ "$1" == "C" ]] && [[ "$2" =~ "$line" ]] || [[ "$2" == "ALL" ]]

не изменяется внутри цикла while. Так что лучше проверьте один раз, прежде чем войти в цикл while. Итак, теперь вы хотите выполнить ops для каждой строки $SHARE/landing/dir/ApprovedList."$1".

Вы можете использовать

xargs -a "$SHARE/landing/dir/ApprovedList.$1" -L 1 ops

EDIT: Если у вас есть простая проверка для каждой строки, вы можете переместить эту проверку в функцию ops.
Сначала сохраните $2 перед входом в функцию:

to_be_checked="$2"
...
ops() {
   [[ "$0" =~ "${to_be_checked}" ]] && return
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...