Что не так с моим скриптом bash для перебора файлов - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть скрипт bash:

#!/bin/bash

file="release-candidate-1.0.tar.gz"
patch_base="patch-1.0."
patch_extension=".tar.gz"
i="1"

while [ -f $file ]
do
    echo $file
    file="${patch_base}${i}${patch_extension}"
    i=$((i+1))
done

При запуске скрипта я получаю:

# ./script.sh
file=release-candidate-1.0.tar.gz: Command not found.
path_base=patch-1.0.: Command not found.
patch_extension=.tar.gz: Command not found.
i=1: Command not found.
file: Undefined variable.
#

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

bash требует, чтобы назначения переменных не отделялись от '=' пробелами. Все должно быть запущено вместе, т. Е.

#!/bin/bash

file="release-candidate-1.0.tar.gz"
patch_bas="patch-1.0."
patch_extension=".tar.gz"
i="1"

while [ -f $file ]
do
    echo $file
    file="${patch_base}${i}${patch_extension}"
    i=$((i+1))
done

Но есть еще

Более типичным способом тестирования для ряда патчей будет

for i in {1..10} ; do
   file="${patch_base}${i}${patch_extension}"
   if [ -f ${file} ] ; then
      echo "Found ${file}"
   else
      echo "NO ${file}"
   fi
done

Вы можете изменить {1..10} на любой диапазон, который вам подходит. ИЛИ, если в диапазоне отсутствуют некоторые числа, вы можете просто ввести значения, для которых вы хотите проверить, то есть for i in 2 4 6 ; do.

Надеюсь, это поможет.

1 голос
/ 08 февраля 2012

Я предлагаю убрать пробелы вокруг знака равенства:

file="release-candidate-1.0.tar.gz"
patch_base="patch-1.0."
patch_extension=".tar.gz"
i="1"

И пока ваш сценарий не будет удовлетворительным, вы можете запустить его, например, с помощью

/bin/bash -vx script.sh
0 голосов
/ 08 февраля 2012

Хорошо, проблема была в том, что на моей машине не был установлен bash.Глупо: D

Я установил bash так:

portsnap fetch
portsnap extract update
cd /usr/ports/shells/bash
make install clean

И затем использовал этот скрипт bash:

#!/usr/local/bin/bash

file="release-candidate-1.0.tar.gz";
patch_base="patch-1.0.";
patch_extension=".tar.gz";
last_patch=500;
got_all_files=1;

for (( i = 0; i <= $last_patch; i++))
do
    if [ $i -eq 0 ]
    then
        if [ ! -f $file ]
        then
            got_all_files=0;
        fi
    else
        file=$patch_base$i$patch_extension;
        if [ ! -f $file ]
        then
            got_all_files=0;
        fi
    fi
done

if [ $got_all_files -eq 0 ]
then
    echo "Missing files.";
    exit;
fi

file="release-candidate-1.0.tar.gz";

for (( i = 0; i <= $last_patch; i++))
do
    if [ $i -eq 0 ]
    then
        tar xzvpf $file
        ./install.sh
        ./services restart
    else
        file=$patch_base$i$patch_extension;
        tar xzvpf $file
        ./patch.sh
    fi
done
...