как манипулировать массивом в сценарии оболочки - PullRequest
6 голосов
/ 28 февраля 2010

Я хочу, чтобы мой скрипт определял пустой массив. Значения массива должны быть добавлены, если предопределенное условие становится истинным. для этого то, что я сделал, это

declare -a FILES
file_count=0
if [ "$file_ext" != "$SUPPORTED_FILE_TYPE" ] ; then
        echo "$file_ext is not supported for this task."
else
        $FILES[$file_count] = $filename
        file_count=$file_count+1
fi

при выполнении этого скрипта я получаю сообщение об ошибке вроде этого

linux-softwares/launchers/join_files.sh: 51: [0]: not found

Ответы [ 3 ]

3 голосов
/ 28 февраля 2010

Когда данные настроек в массиве не возвращаются с $:

declare -a FILES
file_count=0
if [ "$file_ext" != "$SUPPORTED_FILE_TYPE" ] ; then
        echo "$file_ext is not supported for this task."
else
        FILES[$file_count]=$filename
        file_count=$file_count+1
fi

ФАЙЛЫ без $.


Это работает для меня:

#!/bin/bash
declare -a FILES
file_count=0

file_ext='jpg'
SUPPORTED_FILE_TYPE='jpg'
filename='test.jpg'

if [ "$file_ext" != "$SUPPORTED_FILE_TYPE" ] ; then
        echo "$file_ext is not supported for this task."
else
        FILES[$file_count]=$filename
        file_count=$(($file_count+1))
fi

Как видите, небольшая модификация $ (()) для математической операции, но назначения FILES такие же ...


Как указывалось после множества тестов, оболочка Ubuntu по умолчанию выглядит тире, что выдает ошибку.

1 голос
/ 15 марта 2013

Чтобы добавить элемент в конец массива, используйте оператор + = (начиная с bash 3.1 в 2004):

files+=( "$file" )
0 голосов
/ 01 марта 2010

Вы также можете написать это так

declare -a FILES
file_count=0
if [ "$file_ext" != "$SUPPORTED_FILE_TYPE" ] ; then
        echo "$file_ext is not supported for this task."
else
        FILES[((file_count++))]=$filename
fi

Кому: Виджай

крошечная демонстрация, выведите список * .txt файлов в каталог и поместите в массив

declare -a FILES
i=0
for file in *.txt
do
  FILES[((i++))]=$file 
done
# display the array
for((o=0;o<${#FILES};o++))
do
    echo ${FILES[$o]} $o
done

выход

$ ./shell.sh
A.txt 0
B.txt 1
file1.txt 2
file2.txt 3
file3.txt 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...