Как уже сказано Caleb, !
используется для вызова замены истории удара.
Если как я Вы чувствуете, что Вам не нужна такая функция, можно отключить ее вставляющий следующую строку в ~/.bashrc
:
set +H
Мне не нужен он, потому что история может быть восстановлена стрелкой вверх и Ctrl-r возрастающий обратный поиск. См. страницу руководства удара, раздел Commands for Manipulating the History для подробного списка ярлыков.
Похож на простую ошибку: ${ENDOFLINE%$}
полосы a $
в конце $ENDOFLINE
, но то, что Вы хотите сделать, использовать $ENDOFLINE
буквально и имейте a $
после него для указания на конец строки.
if [[ ("$LINE" =~ "^#;") && (( ("$LINE" =~ "${ENDOFLINE}$") )) ]];
Это работает в zsh, но не в ksh или ударе. Bash требует regexp $
закрыться кавычки (иначе, это интерпретируется буквально), и ksh не нравятся двойные круглые скобки внутри [[ … ]]
(это интерпретирует их как арифметическую инструкцию). Эти более простые работы строки во всех трех оболочках (отмечают это [[…]]
одно из нескольких мест, где Вам не нужно "…"
вокруг переменных расширений):
if [[ $LINE =~ ^"#;" && $LINE =~ $ENDOFLINE$ ]];
Если $ENDOFLINE
никогда перекрытия с #;
(например, если ENDOFLINE
;foo
, Вы будете принимать #;;foo
но отклонение #;foo
), можно уменьшить это до единственного теста:
if [[ $LINE =~ ^"#;".*$ENDOFLINE$ ]];
Можно также использовать подстановочный шаблон вместо regexp здесь:
if [[ $LINE = "#;"*"$ENDOFLINE" ]];
[[…]]
конструкция не существует во всех оболочках, это характерно для удара, ksh и zsh. На других оболочках (Граница, тире, что-либо POSIX), можно сделать подстановочные соответствия с case
конструкция:
case $LINE in
"#;"*"$ENDOFLINE") echo score;;
*) echo no score;;
esac
Можно также сделать это использование grep:
end=blah
while read line; do
if grep -Eq "^#;.*$end$" <<< "$line"; then
echo score!
else
echo no score
fi
done
(Это находится в ударе; синтаксис может немного отличаться в других оболочках, но принцип является тем же.)
grep -q "^#;.*$end\$" <&3
.
– Gilles 'SO- stop being evil'
07.04.2011, 00:58