bash: за именем переменной непосредственно следуют другие параметры? - PullRequest
4 голосов
/ 29 июня 2011

Мои скрипты bash имеют переменную $c, которая вызывается в sed -линии, , за которой непосредственно следует другой параметр - и bash (на самом деле довольно логично), кажется, считает, что другой параметр принадлежит имени переменной, что делает его бесполезным / пустым.

(...)
c=$(printf "%02d" $(echo "$i+1"|bc))
sed -n "$cq;d" /var/www/playlisten.txt|cut -c 4-
(...)

В первой строке задается временная переменная, затем она вызывается в качестве аргумента sed.Мне нужно показать bash, что $c заканчивается после c и что переменная не называется $cq (что, конечно, пусто) ...

Любые идеи будут высоко оценены, как всегда.

Спасибо, Кристиан.

PS.То, что я пытаюсь выполнить :) с этим, имеет цикл for, который переходит в 00 ... 50, в цикле необходимо само число, но также и число +1.На всякий случай, если кто-то хочет знать.

Ответы [ 3 ]

8 голосов
/ 29 июня 2011

Вам нужно использовать ${c}q для предотвращения жадного обращения (bash пытается использовать как можно больше допустимых символов):

pax$ export cq=111

pax$ export c=222

pax$ echo $cq
111

pax$ echo ${c}q
222q

Я должен также упомянуть, что, если производительность важна для вас, вы хотите попытаться свести к минимуму количество внешних процессов (например, bc), которые вы запускаете для выполнения своей задачи. Форкинг и исполнение не являются бесплатными действиями, и вы будете работать намного быстрее, если вы заставите bash выполнять большую часть работы для краткосрочных задач.

Под недолговечным я имею в виду такие вещи, как добавление единицы к переменной. Очевидно, что если вы хотите выполнить большую работу, например sed, для всего файла, вам лучше сделать это в выделенном внешнем инструменте, но bash предоставляет довольно много возможностей для замены дорогих операций, таких как i=$(expr $i + 1) или i=$(echo "$i+1"|bc).

Таким образом, цикл

A bash может быть выполнен с инкрементом и другими вычислениями, выполняемыми без внешних процессов:

#!/bin/bash
for ((count = 0; count < 10; count++)) ; do
    ((next = count + 1))
    echo "count is ${count}, sed string is '${next}q;d'."
done

Это выводит:

count is 0, sed string is '1q;d'.
count is 1, sed string is '2q;d'.
count is 2, sed string is '3q;d'.
count is 3, sed string is '4q;d'.
count is 4, sed string is '5q;d'.
count is 5, sed string is '6q;d'.
count is 6, sed string is '7q;d'.
count is 7, sed string is '8q;d'.
count is 8, sed string is '9q;d'.
count is 9, sed string is '10q;d'.

Вы также можете включить next в цикл for:

#!/bin/bash
for ((count = 0, next = 1; count < 10; count++, next++)) ; do
    echo "count is ${count}, sed string is '${next}q;d'."
done
2 голосов
/ 29 июня 2011

немного короче

sed -n "$(printf "%02d" $((i+1)))q;d" /var/www/playlisten.txt|cut -c 4-
2 голосов
/ 29 июня 2011

Введите имя переменной в фигурных скобках:

c=$(printf "%02d" $(echo "$i+1"|bc))
sed -n "${c}q;d" /var/www/playlisten.txt|cut -c 4-
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...