1 (25.05.2012 14:45:15 отредактировано yars)

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

echo -E "mount"

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

2

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

3

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

lupo@gentoo-laptop /tmp % cat test.sh
#!/bin/bash
VAR=mount
echo ${VAR}
lupo@gentoo-laptop /tmp % ./test.sh
mount
Был, был и весь вышел...

4

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

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

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

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.
Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

5

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

6

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

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

7

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

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

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

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

Выводит

: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
Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

8

yars пишет:

Выводит

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

yars пишет:

  word1=${i:0:$SpcNumb}

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

95% процентов проблем находятся между клавиатурой и стулом.

9

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

10

yars пишет:

мне нужно было отпилить первое слово в строке.

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

95% процентов проблем находятся между клавиатурой и стулом.

11

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

12 (26.05.2012 04:14:29 отредактировано Vaicartana)

ormorph пишет:

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

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

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

13

Vaicartana пишет:

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

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

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

14

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

15

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

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

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

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

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

16

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

17

Vaicartana пишет:

А вот знак $ в awk'e перед переменными не ставится

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

18

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

19 (26.05.2012 16:00:07 отредактировано ormorph)

Vaicartana пишет:

Я чесногря не проверял что выдаст $var...

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

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

20 (26.05.2012 18:27:39 отредактировано Vaicartana)

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