Tomsk Sysadmins Forum

Unix => Программирование => Topic started by: Comrad on May 14, 2006, 22:20:09

Title: Ошибка в скрипте
Post by: Comrad on May 14, 2006, 22:20:09
Здравствуйте.
Набросал скрипт для поиска файлов в RPM-пакетах

Code: [Select]
#!/bin/sh
set -x
find_file()
{
#set +x
    RPM_PATH="/mnt/iso/ASPLinux-11-d$INSTALL_DISK/ASPLinux/RPMS"
set +x    
    for i in `ls $RPM_PATH/*.rpm`; do
    TEMP_STRING=`rpm -qpl $i | grep $FILE_NAME`
    if [ -n "$TEMP_STRING" ]; then
        echo "$TEMP_STRING"
        echo -e "\t in $i"
    fi
    done
}

if [ -z "$1" ]; then
    echo "No string input."
    exit
fi

FILE_NAME="$1"

if [ -z "$2" ]; then
    INSTALL_DISK="0"
else
    INSTALL_DISK="$2"
fi

echo "$INSTALL_DISK"

case "$INSTALL_DISK" in
    0)
    for $INSTALL_DISK in 1 2 3 4; do
        find_file
    done
   ;;
    1|2|3|4)
    find_file
   ;;
    *)
    echo "ERROR"
   ;;
esac
Скрипт принимает два параметра - фрагмент имени файла и номер диска (смонторованые iso).
При использовании номера диска 1, 2, 3 или 4 все работает нормально.
Но при использовании 0 (все диски) появляется ошибка (так же использовал 5, all, ...):
Code: [Select]
root@niko:# ./find_rpm abc 0
+ '[' -z abc ']'
+ FILE_NAME=abc
+ '[' -z 0 ']'
+ INSTALL_DISK=0
+ echo 0
0
./find_rpm: line 45: `$INSTALL_DISK': not a valid identifier
Пробовал на ASPLinux-11 и на SW-10 не работает одинаково.
Подскажите в чем ошибка.
Title: Ошибка в скрипте
Post by: demiurg on May 14, 2006, 23:51:52
Quote from: Comrad
Здравствуйте.
Набросал скрипт для поиска файлов в RPM-пакетах
....
./find_rpm: line 45: `$INSTALL_DISK': not a valid identifier
[/code]
Пробовал на ASPLinux-11 и на SW-10 не работает одинаково.
Подскажите в чем ошибка.
Чего только люди не придумают чтобы yum или apt-get не использовать
Title: Ошибка в скрипте
Post by: Wut on May 15, 2006, 17:30:01
Я вообще не спец, но может переменные используемые в case не могут менять своего значения внутри дествия этого case? попробуй так
Code: [Select]
#!/bin/sh
set -x
find_file()
{
#set +x
    RPM_PATH="/mnt/iso/ASPLinux-11-d$INSTALL_DISK/ASPLinux/RPMS"
set +x    
    for i in `ls $RPM_PATH/*.rpm`; do
    TEMP_STRING=`rpm -qpl $i | grep $FILE_NAME`
    if [ -n "$TEMP_STRING" ]; then
        echo "$TEMP_STRING"
        echo -e "\t in $i"
    fi
    done
}

if [ -z "$1" ]; then
    echo "No string input."
    exit
fi

FILE_NAME="$1"

if [ -z "$2" ]; then
    INSTALL_DISK="0"
else
    INSTALL_DISK="$2"
fi

echo "$INSTALL_DISK"

TEMP_VAR = $INSTALL_DISK
case "$TEMP_VAR" in
    0)
    for $INSTALL_DISK in 1 2 3 4; do
        find_file
    done
  ;;
    1|2|3|4)
    find_file
  ;;
    *)
    echo "ERROR"
  ;;
esac
Title: Ошибка в скрипте
Post by: demiurg on May 15, 2006, 18:48:52
Quote from: Wut
Я вообще не спец, но может переменные используемые в case не могут менять своего значения внутри дествия этого case? попробуй так
Я автору темы посоветовал бы прочитать http://ruslandh.narod.ru/howto_ru/Bash-Pro...og-Intro-8.html (http://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/Bash-Prog-Intro-8.html)
Глобальные переменные это вообще плохой стиль программирования, на чем бы программа не писалась.
Code: [Select]
#!/bin/sh
find_file()
{
    RPM_PATH="/mnt/iso/ASPLinux-11-d$1/ASPLinux/RPMS"
    for i in `ls $RPM_PATH/*.rpm`; do
    TEMP_STRING=`rpm -qpl $i | grep $FILE_NAME`
    if [ -n "$TEMP_STRING" ]; then
        echo "$TEMP_STRING"
        echo -e "\t in $i"
    fi
    done
}

if [ -z "$1" ]; then
    echo "No string input."
    exit
fi

FILE_NAME="$1"

if [ -z "$2" ]; then
    INSTALL_DISK="0"
else
    INSTALL_DISK="$2"
fi

echo "$INSTALL_DISK"

case "$INSTALL_DISK" in
    0)
    for I in 1 2 3 4; do
        find_file $I
    done
 ;;
    1|2|3|4)
    find_file $INSTALL_DISK
 ;;
    *)
    echo "ERROR"
 ;;
esac
Что-то вот в этом духе....
Title: Ошибка в скрипте
Post by: Comrad on May 15, 2006, 19:01:04
Quote from: demiurg
Чего только люди не придумают чтобы yum или apt-get не использовать
Хочу поближе познакомиться с содержимым пакетов. Поэтому приходится руками обходиться.
Title: Ошибка в скрипте
Post by: Comrad on May 15, 2006, 19:12:04
Спасибо за ссылку.

Дело оказалось в $ перед INSTALL_DISK в конструкции for.
Убрал и все закрутилось.

Спасибо всем ответившим.