LINUX.ORG.RU
решено ФорумAdmin

Объясните, почему не работает этот скрипт как должен?

 ,


0

1

Всем привет!

Кто-нибудь может объяснить, почему результаты работы этого кода именно такие?

set -e
args=("$@")
dd=0                                                                            
dc=0                                                                  
dm=0                                                                 
declare -a array                                                                                            
for opt in $args; do                                                                                          
    if [[ "$opt" -eq "-dd" ]]; then                                                                           
        dd=1                                                                                                  
        echo "dd"                                                                                             
    elif [[ "$opt" -eq "-dc" ]]; then                                                                         
        dc=1                                                                                                  
        echo "dc"                                                                                             
    elif [[ "$opt" -eq "-dm" ]]; then                                                                         
        dm=1                                                                                                  
        echo "dm"                                                                                             
    else                                                                                                      
        array[${#array[*]}]="$opt"                                                                        
        echo "$opt"                                                                                           
        echo ${array[@]}                                                                                    
    fi                                                                                                        
done

$ ./myscript -dm -dc -dd arg1 arg2
dd

Ожидалось, что скрипт прочитает все флаги, которые ему переданы и все остальные аргументы скинет в другой массив, но, как видно, после первого if цикл заканчивается.

★★

Последнее исправление: aido (всего исправлений: 1)

-eq это же для сравнения чисел, должно быть == (это независимо от выхода из цикла). А проблема с использованием массива:

- for opt in $args; do
+ for opt in ${args[@]}; do

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 2)
Ответ на: комментарий от xaizek

а как sed-ом удалить последовательность строк (шаблон - функция на плюсах)?

я пробовал как-то так, не вышло:

sed -i "/\$cls::\$cls() \$cls_parents()\n{\n\n}/d" file.cpp

aido ★★
() автор топика

Про 'case' что-нибудь слышал?

anonymous
()
Ответ на: комментарий от xaizek

Еще вопрос. опять же про экранирование в sed. Почему вот такой однострочник выдает sed: -e выражение #1, символ 15: незавершенная команда `s'

sed -i "s|/*data*/|$vars|" filename

переменная vars содержит много символов, которые самим седом могут трактоваться двусмысленно. Как их автоматически заэкранировать и вчистую подставить вместо /*data*/ всё содержимое vars?

aido ★★
() автор топика
Ответ на: комментарий от aido

Это скорее надо делать вне sed. Средствами bash можно вполне, надо заменять только \1-\9, & и |. Вроде такого:

vars=${vars//\\/\\\\}
vars=${vars//&/\\&}
vars=${vars//|/\\|}

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

А * и ; как экранируются? так?

vars=${vars//*/\\*}                                                                                   
vars=${vars//;/\\;}

aido ★★
() автор топика
Ответ на: комментарий от aido

Мое лентяйство. Многострочники на перле удобнее парсить.

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.