LinuxForum.Fans
Тема

Bash и echo в скрипте: сделать, чтобы переменная просто выводилась?

Автор: yars 20 сообщений 2931 просмотров
#254127

Доброго времени!
Вот, не могу разобраться, как сделать, чтобы при выводе переменной через echo $variable bash не пытался выполнить команду. Если, к примеру, я скажу

text
echo -E "mount"

в командной строке, то просто выведется слово. А в скрипте echo что с параметрами, что без, приводит к попытке выполнить команду. Как это отключить? Ну, info bash, Bash Scripting... читаю, но не могу понять.

#254131

А что за скрипт?
Что то не получается чтобы команда выводилась )

#254132

Не совсем понятно, но...

text

lupo@gentoo-laptop /tmp % cat test.sh
#!/bin/bash
VAR=mount
echo ${VAR}
lupo@gentoo-laptop /tmp % ./test.sh
mount
#254133

Вот проблемный участок:

text
while read "i"; do
    length=$(expr length "$i")
    word1=$($i:1:$( expr index "$i" " " ) )
    echo -E "$word1";
    echo "length: $length"
done < "$1"

Я ему скормил файл /mnt/README:

text
cat /mnt/README

The purpose of the /mnt directory is to provide a place for the admin to mount block device temporarily. Any of the subdirectories of /mnt may be used, or volumes may even be mounted directly on /mnt (which is the traditional way of doing things, though /mnt/tmp is also provided for the purpose of mounting any kind of volume temporarily).

See the /media directory also.

#254135

Ну да в круглых скобках и должно выполняться)

#254141

Смею предположить, что должно быть что то типа:

text
while read "i"; do
    length=$(expr length "$i")
    word1="$i:1:$( expr index "$i" " " )"
    echo -E "$word1";
    echo "length: $length"
done < "$1"
#254163

Мне нужно получить вот что:

text
$ S="STRING list" echo ${S:0:3}
STR

Но как подставить число последним параметром?
Привел этот код к виду

text
while read "i"; do
    length=$(expr length "$i")
    SpcNumb=`expr index "$i" " "`
    word1=$i:0:$SpcNumb
    echo "$word1";
    echo "length: $length"
done < "$1"

Выводит

text
:0:0
length: 0
The purpose of the /mnt directory is to provide a place for the admin to:0:4
length: 72
mount block device temporarily.  Any of the subdirectories of /mnt may be:0:6
length: 73
used, or volumes may even be mounted directly on /mnt (which is the:0:6
length: 67
traditional way of doing things, though /mnt/tmp is also provided for:0:12
length: 69
the purpose of mounting any kind of volume temporarily).:0:4
length: 56
:0:0
length: 0
See the /media directory also.:0:4
length: 30
:0:0
length: 0
#254169
"yars" написал:
Выводит

а что из этого то должно получится?

"yars" написал:
word1=${i:0:$SpcNumb}

моих телепатических спсобностей хватает, чтобы предположить, что здесь должны быть фигурные скобки:

#254171

Именно фигурных скобок и не хватало, мне нужно было отпилить первое слово в строке. Спасибо всем!

#254175
"yars" написал:
мне нужно было отпилить первое слово в строке.

делается проще:
word1="${i%% *}"

#254184

способов вроде много, можно еще:
echo $i|awk '{print $1}'

#254298
ormorph написал:
способов вроде много, можно еще:
echo $i|awk '{print $1}'

это изврат, имхо...

text

awk -v $VAR '{print $0}'
#254306
Vaicartana написал:
это изврат, имхо...
text

awk -v $VAR '{print $0}'

И как? работает?

#254313

эээ... поспешил
надо так
awk -v $VAR '{print VAR}'

#254333

Я еще поверю что такой синтаксис будет работать:

text
#!/bin/bash
ted="dfvg gfgf fgf"
foo="1"
echo $ted|awk -v var=$foo '{print $var}'

хотя его можно заменить таким:

text
#!/bin/bash
ted="dfvg gfgf fgf"
foo="1"
echo $ted|awk '{print $'$foo'}'

Но то чтобы так awk -v $VAR '{print VAR}', очень сомневаюсь...

#254354

нда.. сказывается скорость и копи+пасте
awk -v var=$VAR
конечно же....
А вот знак $ в awk'e перед переменными не ставится

#254366
"Vaicartana" написал:
А вот знак $ в awk'e перед переменными не ставится

А он там в скрипте и не стоит, это просто дополнение к переменной, то есть возвращает значение $1 вместо просто 1

#254398

а рази склейку строк не пробелом делают? Я чесногря не проверял что выдаст $var...

#254417
"Vaicartana" написал:
Я чесногря не проверял что выдаст $var...

var=$foo - присваивает значение переменной foo в данном случае это один, далее при выводе, $var, знак долара, воспринимает переменную var как переменную первого поля $1 с нею работает команда awk print.
Другими словами $ в awk работает только с числовыми значениями.
Так уж awk воспринимает.
Т.е. делает то же самое что и команда:

echo "dfvg gfgf fgf"|awk '{print $1}'

#254457

ооо... какооойизврат! ))))
но мысль понял, возьму на заметку )

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