Так или иначе передать переменную до н.э, имея команду, которая будет выполняться?

GNU ls --ignore опция берет стандартные шаблоны имени файла, не a ksh расширенный один (что bashbash только, нет ls) распознает с extglob)

Таким образом, можно сделать:

ls -AR --ignore='*.[ch]' --ignore='*.cpp'

Но Вы не можете сделать:

ls -AR --ignore='!(*.[ch]|*.cpp)'

Который просто проигнорировал бы файлы, названные как: !(foo.c|bar.cpp).

В ls -AR --ignore=!(*.c), так как шаблон не заключается в кавычки, bash попытался бы развернуть его прежде, чем передать его ls. Таким образом, это посмотрело бы в текущем каталоге для файлов, имя которых запускается с "--ignore=" и не заканчивается в ".c". Например, если было два файла, один названный --ignore=foo и один названный --ignore=bar, это работало бы ls с теми четырьмя аргументами: "ls", "-AR", "--ignore=bar", "--ignore=foo".

Можно сделать (с GNU, находят).

find . -regextype posix-extended -regex '.*\.([ch]|cpp)' -ls

Или с любым POSIX find:

find . \( -name '*.[ch]' -o -name '*.cpp' \) -exec ls -ld {} +

Или принятие там не является никакими символьными ссылками на каталоги:

shopt -s extglob globstar dotglob failglob
ls -ld -- **/*.@([ch]|cpp)

На этот раз, bash действительно разворачивает globbing шаблон и передает список файлов к ls.

6
16.04.2015, 13:11
4 ответа

Простые цитаты не расширяют $ переменную. Вы должны использовать двойные кавычки:

var3=`bc <<< "scale=2; $var2"`

с другой стороны, $ var1 и $ var2 не будет хранить float ( bash не управлять их ), так что вы BC вместо этого.

diff=$(($epoc2-$epoc1))
var1=$(bc <<< "scale=3 ; $diff / 60")
var2=$(bc <<< "scale=3 ; $var1 / 57")
var3=$(bc <<< "scale=2; $var2")
6
27.01.2020, 20:23

Если ваши вычисления BC несколько связаны, вы также можете использовать здесь документы, чтобы сделать его более читаемым:

var2=500
bc << EOF
scale=2
$var2 + 100
EOF

вычисляется

600
2
27.01.2020, 20:23

Сообщение об ошибке означает, что у вас есть буквальный знак доллара на вашем входе на BC . В оболочке отдельные цитаты сохраняют буквальное значение каждого персонажа. Используйте Двойные кавычки для интерполяции переменных:

bc <<< "scale=2; $var2"

Это, вероятно, не получит нужный вывод, хотя, поскольку BC , как правило, не обременяет или поступает входные значения. Вы можете обмануть его, используя отдел NO-OP:

bc <<< "scale=2; $var2 / 1"

, который приведет к обеспечению масштаба 2DP на выходе.


Было бы проще (и, вероятно, более точнее) сделать все это в калькуляторе, хотя - оба VAR1 и VAR2 будут иметь результаты целочисленного деления в Bash и POSIX шт.

var3=`bc <<< "scale = 2 ; $diff / 60 / 57"`

Это даст математически правильный ответ, соответствующим образом округленный. Если вы хотите целочисленное поведение и BC масштабирование по какой-то причине, вы можете использовать другую версию.

2
27.01.2020, 20:23

Выражение не расширяется из-за единых галочек .

Используйте что-то вроде:

var3=$(bc <<< "scale=2; $var2")
3
27.01.2020, 20:23

Теги

Похожие вопросы