2013-09-23 3 views
-4

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

#!/bin/bash 
    RESULT_DIR="./imgR" 
    rm -r $RESULT_DIR 
    mkdir $RESULT_DIR 
    widthOrigin=0 
    heightOrigin=0 
    widthR=0 
    heightR=0 
    for i in ~/img/{*.jpg,*.jpeg,*.png,*.JPG,*.JPEG,*.PNG} 
    do 
    echo "file" $i 
    if [ -f $i ] 
    then 
    echo "file1" 
    widthOrigin=`identify -format "%w" $i` 
    #$checkTwo 
    widthR=$(checkTwo $widthOrigin) 
    heightOrigin=`identify -format "%h" $i` 
    #heightR=$(checkTwo $heightOrigin) 

    echo "width origin" $widthOrigin " width power 2" $widthR 
    echo "height origin" $heightOrigin "wicth power 2" $heightR 

    #convert -resize $widthR $heightR $i $RESULT_DIR/$(basename "$i") 
    fi 
    done 
    exit 0 

и моя функция

checkTwo(){ 
    echo "checkTwo" 
    param=$1 
    echo "param" $param 
    if [ param -ge "1024"] 
    then 
    return 1024 
    else 

    if [param -ge "512"] 
    then 
    return "512" 
    else 

    if [param -ge "256"] 
    then 
    return "256" 
    else 

    if [param -ge "64"] 
    then 
    return "64" 
    else 

    if [param -ge "32"] 
    then 
    return "32" 
    else 

    if [param -ge "16"] 
    then 
    return "16" 

    else 
    if [param -ge "4"] 
    return "4" 
    else 
    return "2" 

    fi fi fi fi fi fi fi 
    } 
    } 
    #end 

, но в строке "widthR = $ (checkTwo $ widthOrigin)" л есть ошибка «Функция не widthOrigin найдено»

ответ

1

Оно должно быть:

if [ "$param" -ge "1024" ] 

Вам нужен знак доллара перед переменной имя для его расширения. И вам нужны пробелы около [ и ]. Котировки вокруг $param необходимы, чтобы избежать проблемы, если параметр пуст или содержит пробелы.

Другая проблема: функция должна использовать echo, а не return, так как вы используете ее в $(...), что заменяет функцию функции.

Вы также не нужны все эти вложенные if с, с мильоном fi сек в конце концов, если вы используете elif между случаями вместо else if.

if ... 
then ... 
elif ... 
then ... 
elif ... 
then ... 
else ... 
fi 

Я не могу объяснить, почему вы получаете конкретную ошибку вы получаете, так как нет никакой ссылки на функцию widthOrigin.

На самом деле я бы реализовать всю эту функцию в цикле:

x=1024 
while [ "$param" -lt $x ] && [ $x -gt 2 ] 
do 
    x=((x>>1)) 
done 
echo $x 
+0

Но проблема в функции вызова. Если я использую checkTwo $ widthOrigin - у меня есть ошибка «comand not found» – user2542715

+0

У вас, кажется, есть дополнительный '}' после окончания функции, хотя я не думаю, что это должно вызвать такую ​​проблему. Является ли определение функции тем же скриптом, что и вызывающий? – Barmar

Смежные вопросы