скрипты bash: как проверить членство в списке - PullRequest
3 голосов
/ 30 ноября 2010

(это debian squeeze amd64)

Мне нужно проверить, является ли файл членом списка файлов.Итак, мой (тестовый) скрипт:

set -x
array=$( ls )
echo $array
FILE=log.out
# This line gives error!
if $FILE in $array
then   echo "success!"
else  echo "bad!"
fi
exit 0

¿Есть идеи?

Спасибо за все ответы.Чтобы уточнить: приведенный сценарий является лишь примером, реальная проблема является более сложной.В конечном решении это будет сделано в цикле, поэтому мне нужно, чтобы файл (имя) был проверен на наличие переменной.

Еще раз спасибо.Нет, мой тест-скрипт работает и читает:

</p>

<code>  in_list() {
       local search="$1"
       shift
       local list=("$@")
       for file in "${list[@]}" ; do
           [[ "$file" == "$search" ]] && return 0
       done
       return 1
    }
    #
    # set -x
    array=( * )  # Array of files in current dir
    # echo $array
    FILE="log.out"
    if in_list "$FILE" "${array[@]}" 
    then   echo "success!"
    else  echo "bad!"
    fi
    exit 0
</code>

Ответы [ 3 ]

3 голосов
/ 30 ноября 2010
if ls | grep -q -x t1 ; then
  echo Success
else
  echo Failure                                                                                
fi

grep -x соответствует только полным строкам, поэтому ls | grep -x возвращает что-то, только если файл существует.

2 голосов
/ 30 ноября 2010

Если вы просто хотите проверить, существует ли файл, то

[[ -f "$file" ]] && echo yes || echo no

Если ваш массив содержит список файлов, сгенерированных другими способами, отличными от ls, то вы должны выполнить итерацию по нему какпродемонстрировано Сорпигалом.

2 голосов
/ 30 ноября 2010

Как насчет

in_list() {
    local search="$1"
    shift
    local list=("$@")
    for file in "${list[@]}" ; do
        [[ $file == $search ]] && return 0
    done
    return 1
}

if in_list log.out * ; then
    echo 'success!'
else
    echo 'bad!'
fi

РЕДАКТИРОВАТЬ: сделал его немного менее идиотским.

РЕДАКТИРОВАТЬ # 2: Конечно, если все, что вы делаете, смотрит в текущий каталог, чтобы увидеть, есть ли конкретный файл, что фактически делает то, что делает выше, то вы можете просто сказать

[ -e log.out ] && echo 'success!' || echo 'bad!'

Если вы на самом деле делаете что-то более сложное, включая списки файлов, этого может быть недостаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...