LinuxForum.Fans
Тема

Разница в интерпретации переменной: терминал и скрипт

Автор: MbI_BCE_YMPEM 11 сообщений 2692 просмотров
#110153

Доброго времени суток.
По какой причине:

text

"havearcnoarch=$(ls /data/arch/BASE/arch_$archno??_* | wc -l)"

из скрипта дает:

text

ls: /data/arch/BASE/arch_: No such file or directory
ls: 664??_*: No such file or directory"

А из консоли все ок. Получаю число.

В скрипте:

text

#!/bin/bash

У пользователя в passwd аналогично.

#111763

такое может быть если значение переменной $archno " 664"
то есть с пробелом перед числом.
тогда происходит попытка выполнить команду
ls /data/arch/BASE/arch_ 664??_*
И вполне закономерно мы получаем две ошибки :)
Покажите весь скрип целиком.

#111925

Да есть пробел это вывод sqlplus:

text

   archno=`$ORACLE_HOME/bin/sqlplus -S '/as sysdba' << EOF
   set heading off feedback off termout off
   select trunc(max(sequence#)/100)-2 from v\\$archived_log where applied='YES'; 
   quit;
   EOF`

причем функция ltrim не помогла избавиться от пробела в запросе, но решилась проблему в shell'е:

text
havearcnoarch=`ls /smart/arch/LADA_SB/ | grep "arch_$archno??_*" | wc -l`

Может быть кто-то подскажет откуда берется "фантомный" пробел?!

#111957
MbI_BCE_YMPEM написал:
Может быть кто-то подскажет откуда берется "фантомный" пробел?!

из SQL.

Вот как убрать:
[console]$ X=`echo ' Z ' | sed 's/^ *//; s/ *$//'`
$ echo "'$X'"
'Z'
[/console]

#111958

чёт у меня

text
archno=`$ORACLE_HOME/bin/sqlplus -S '/as sysdba' << EOF
   set heading off feedback off termout off
   select trunc(max(sequence#)/100)-2 from v\\$archived_log where applied='YES'; 
   quit;
EOF`

таким макаром ваще не работает не получает номер.

то что выводит sqlplus мб посмореть как

text
select '"'||(trunc(max(sequence#)/100)-2)||'"' from v$archived_log where applied='YES'; 

?

#116600
drBatty написал:

Вот как убрать:
[console]$ X=`echo ' Z ' | sed 's/^ *//; s/ *$//'`
$ echo "'$X'"
'Z'
[/console]

Одинарные кавычки экранируют $. И я увижу $Z, а не нужное значение. С двойными лучше, но пробел остался.

#116659
MbI_BCE_YMPEM написал:
Одинарные кавычки экранируют $. И я увижу $Z, а не нужное значение. С двойными лучше, но пробел остался.

неа.
одинарные кавычки НЕ экранируют $ если они внутри двойных.
попробуйте сами запустить мой пример, вы увидите именно содержимое $X, а вовсе не '$X'

Сами пробелы убираются sed командами замены:

text
s/^ *//

Эта sed команда убирает пробелы в начале строки.

text
s/ *$//

А эта в конце.
В php есть trim() для той-же цели.

#116687

Вот так заработало.

text

archnox=`echo $archno | sed 's/^ *//; s/ *$//'` 
 
echo $archnox 
#116691
MbI_BCE_YMPEM написал:
archnox=`echo $archno | sed 's/^ *//; s/ *$//'`
text
archnox=`echo "$archno" | sed 's/^ *//; s/ *$//'` 

так лучше.
если archno="*", то echo распечатает не звёздочку, а все файлы в каталоге (по вашему варианту).

#116692

да, а ещё лучше "${archno}"

#116695

Спасибо. Плюсану. ;)

Войдите или зарегистрируйтесь, чтобы ответить.