Проверьте несколько файлов, имеющих размер больше нуля в KornShell - PullRequest
0 голосов
/ 18 октября 2018

Ниже приведен простой скрипт, позволяющий выяснить, существуют ли все файлы и имеют размер больше нуля или нет.Начиная с здесь Я знаю, что для этой задачи используется '-s'.

if [ -s ${file1} && -s ${file2} && -s ${file3}]; then
   echo "present"
   echo "Perform analysis"
else
   echo "not present";

   echo "Value of file1: `-s ${file1}`"
   echo "Value of file2: `-s ${file2}`"
   echo "Value of file3: `-s ${file3}`"
   echo "skip";
fi

Файлы находятся по пути, аналогичному сценарию.Я проверил имена файлов, и это правильно.Я получаю следующую ошибку:

./temp.ksh[]: [-s: not found [No such file or directory]
not present
./temp.ksh[]: -s: not found [No such file or directory]
Value of file1:
./temp.ksh[]: -s: not found [No such file or directory]
Value of file2:
./temp.ksh[]: -s: not found [No such file or directory]
Value of file3:

Кажется, я не могу понять, что не так с выше.Это специфично для KornShell?Я могу использовать только KSH.

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Применительно к этот ответ на вопрос.Ошибка использует [] в операторе if вместо [[]], поскольку [[]] может интерпретировать &&, но [] не может.

0 голосов
/ 20 октября 2018

Остальные ответы выглядят хорошо для меня, но я должен был попробовать это просто, чтобы увидеть.Это работает для меня:

file1=a.txt
file2=b.txt
file3=c.txt

if [[ -s ${file1} && -s ${file2} && -s ${file3} ]]
then
    echo "present"
    echo "Perform analysis"
else
    echo "not present";

    for name in ${file1} ${file2} ${file3}
    do
        if [[ ! -s ${name} ]]
        then
            date > ${name}  # put something there so it passes next time
            echo "just created ${name}"
        fi
    done
    echo "skip";
fi

Я поместил это в файл с именем checkMulti.sh и получил следующий вывод:

$ ksh checkMulti.sh
not present
just created a.txt
just created b.txt
just created c.txt
skip
$ ksh checkMulti.sh
present
Perform analysis
$ rm a.txt
$ ksh checkMulti.sh
not present
just created a.txt
skip
$ ksh checkMulti.sh
present
Perform analysis

Использование одиночных скобок [ушло с помощью ksh 88. Я предлагаю всегда использовать двойной [[в эти дни.

Кроме того, убедитесь, что у вас есть пробелы до и после скобок и перед тире.Я просто попытался воспроизвести вашу ошибку и получил (это неправильно):

$ if [[-s fail]]   #<<< missing space before -s and after filename
> then
> echo yes
> fi
-ksh: [[-s: not found [No such file or directory]
$

Но если я вставлю нужные места (и создаю файл), я получу:

$ date > good  # put something in a file
$ if [[ -s good ]]
> then
>     echo yes
> fi
yes
$
0 голосов
/ 18 октября 2018

Вы, похоже, неправильно поняли команду test, которая также записана как [ Conditional Expression ].Условные выражения могут быть записаны внутри команды test, но не могут использоваться в качестве исполняемого оператора.

То есть not do

echo "Value of file1: `-s ${file1}`"

Но do

echo "Value of file1: $( [[ -s ${file1} ]] && echo 0 || echo 1)"

Кроме того, -s не возвращает размер, но проверяет, равен ли размер нулю или нет, как код возврата.

Кроме того, testкоманда не знает && (как упомянуто ответом Анкита Чаухуна ).

Итак не делай

if [ -s ${file1} && -s ${file2} && -s ${file3} ]; then

Но делай любой из

if [ -s ${file1} ] && [ -s ${file2} ] && [ -s ${file3} ]; then
if [[ -s ${file1} && -s ${file2} && -s ${file3} ]]; then

Тебя может заинтересовать:

if [[ -s ${file1} && -s ${file2} && -s ${file3} ]]; then
   echo "present"
   echo "Perform analysis"
else
   echo "not present";

   stat --printf="Value of file1: %s" "$file1"
   stat --printf="Value of file2: %s" "$file2"
   stat --printf="Value of file3: %s" "$file3"
   echo "skip";
fi
...