Ожидаемая ошибка двоичного оператора при запуске сценария bash в каталоге, отличном от того, в котором в данный момент находится сценарий - PullRequest
1 голос
/ 08 апреля 2020

Я очень новичок в сценариях bash в первую очередь. Я написал скрипт, который проверяет записи внутри каталога и печатает информацию о них. Если записи являются файлами, он печатает размер файла и, если есть каталоги, он печатает, сколько элементов в этих каталогах. Когда я запускаю скрипт к каталогу, он находится в скрипте и завершается успешно. Если я запускаю сценарий для другого каталога, я получаю сообщение об ошибке «Ожидается двоичный оператор». Это ожидать? Вот код:

#!/bin/bash
# Print the contents of a directory with details on files and directories

files=( $1* )
count=0
for entry in $1/*
do
    if [ -d $entry ]
    then
        for f in $entry/*
            do
                let count=count+1
            done
        echo $entry ":" "This is a directory with $count files present."
        let count=0
    else [ -f $entry ]
        echo $entry "This is a file of" $(wc -c <"$entry") "bytes."
    fi
done

Я уверен, что этот код не идеален и, скорее всего, имеет более простой метод, поэтому я просто ищу несколько советов. Спасибо за любую помощь.

FurmanTheGerman

1 Ответ

1 голос
/ 09 апреля 2020

Исправлен скрипт:

#!/usr/bin/env sh

for entry in "$1/"*; do
  if [ -d "$entry" ]; then
    count="$(printf '%s\0' "$entry/"* | grep -cF '')"
    printf '%s : This is a directory with %d files present.\n' "$entry" "$count"
  else
    if [ -f "$entry" ]; then
      size="$(wc -c <"$entry")"
      printf '%s This is a file of %d bytes.\n' "$entry" "$size"
    fi
  fi
done
  • Удалено неиспользуемое назначение с пропущенными кавычками вокруг аргумента $1:
    files=( $1* )
  • Исправлены пропущенные кавычки вокруг $entry переменная:
    if [ -d $entry ]
  • Заменено l oop на одно присваивание, прерванный отступ и пропущенные кавычки вокруг неблокирующей части пути $entry/:

        for f in $entry/*
            do
                let count=count+1
            done
    
  • Заменили echo, смешивая литерал и переменные с пропущенными кавычками на правильные printf: echo $entry ":" "This is a directory with $count files present." echo $entry "This is a file of" $(wc -c <"$entry") "bytes."
  • Добавлены пропущенные кавычки вокруг переменной $entry и добавлены пропущенные if блок: else [ -f $entry ]

Пояснения к подсчету записей в каталоге без запуска оболочки l oop:

printf '%1s\0' "$entry/"* | grep -cF '':

  • printf '%1s\0' "$entry/"*: печать списка всех файлов с нулевым разделителем.
  • | grep -cF '': передача его в grep для подсчета null символов (1 на каждую запись)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...