2015-09-28 2 views
0

У меня есть две переменные, каждая из которых содержит по 6 значений, и я изо всех сил пытаюсь понять, как сравнивать значения. Я даже не уверен, как проверить их тип, чтобы быть честным, после поиска.Как сравнить элементы в переменной с помощью Bash?

Вот одна из функций:

localfiles="$(ls -l string_matching_pattern_* | awk '{print $5}')" 
#Matches to the string_matching_pattern and then assigns their file sizes to the variable localfiles 

echo "$localfiles" 
10 
123 
4873 
8734 
2109 

Вторая функция является по существу то же самое, но захватывает размеры файлов из ведра AWS S3:

aws s3 ls s3://bucket/folder1 | awk '{print $3}' 
s3files="$(aws s3 ls s3://bucket/folder1 | awk '{print $3}')" 
echo "$s3files" 
10 
123 
4873 
8734 
1111 

S о принципе, как я могу сравнить эти выходные или значения то, что в localfiles к s3files

+1

@chepner: ОП разборе команду ls, чтобы получить размер файла ... –

+2

'localsizes = (стат -c '% s' string_matching_pattern _ *)' , тогда. (Или любая форма, которую требует ваш локальный 'stat', но все же [не разбирайте' ls'] (http://mywiki.wooledge.org/ParsingLs)). – chepner

+2

Поместите их в массив, а не в строку, затем зациклируйте на индексы массива. – Barmar

ответ

3

Дано:

$ localfiles="10      
123 
4873 
8734 
2109" 
$ s3files="10 
123 
4873 
8734 
1111" 

вы могли бы сделать

$ paste -d"-" <(echo "$localfiles") <(echo "$s3files") | bc 
0 
0 
0 
0 
998 

или

$ while read -u3 localsize; read -u4 s3size; do 
    echo $((localsize - s3size)) 
done 3<<<"$localfiles" 4<<<"$s3files" 
0 
0 
0 
0 
998 

с массивами:

$ unset localfiles s3files 
$ localfiles=(10 123 4873 8734 2109) 
$ s3files=(10 123 4873 8734 1111) 
$ for i in "${!localfiles[@]}"; do echo $((${localfiles[i]} - ${s3files[i]})); done 
0 
0 
0 
0 
998 
+0

Во втором варианте, который начинается с 'while read', являются именами' localsize' и 's3size'? Или переменные? Я просто немного потерял это, и 3-я строка с 'done 3 <<<" $ localfiles "4 <<<" $ s3files "' – simplycoding

+0

'<<<' - это [«здесь-строка»] (http : //www.gnu.org/software/bash/manual/bashref.html#Here-Strings). Как и другие перенаправления, вы можете предоставить файловый дескриптор, здесь я использую '3' и' 4', поэтому команды 'read' могут отображать каждую строку из соответствующей строки из-за соответствующих опций' -u'. В последней итерации переменная 'localsize' имеет значение' 2109', а переменная 's3size' имеет значение' 1111' –

+0

. Каков правильный способ вызова индексов в '' '' '' '' 'внутри цикла while?Я пробовал 'if [((localsize - s3size)) -eq 0];' и он не работает – simplycoding

0

Сохранение значений в массивы вместо переменных, это должно сделать ваши ценности легче сравнивать:

local_sizes=() 
s3_sizes=() 

for i in $(ls -l string_matching_pattern_* |awk '{print $5}') 
do  
    local_sizes+=($i) 
done 

for i in $(aws s3 ls s3://bucket/folder1 | awk '{print $3}') 
do 
    s3_sizes+=($i) 
done 

printf '%s\n' "${local_sizes[@]}" 
printf '%s\n' "${s3_sizes[@]}" 
+0

Спасибо, пытался понять. По предложению @chepner я заменил команду 'ls' и функцию' stat' – simplycoding

+0

Образец кода здесь следует множеству плохих практик. См. Http://shellcheck.net/ вывод, если дано то же самое, а также http://mywiki.wooledge.org/BashPitfalls и http://mywiki.wooledge.org/ParsingLs; Аналогично, http://mywiki.wooledge.org/BashFAQ/087 –

+0

BTW, 'printf '% s \ n'" $ {arrayname [@]} "намного дешевле/проще/быстрее, чтобы распечатать все содержимое массив, обозначенный символом новой строки. –

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