GNU ls
--ignore
опция берет стандартные шаблоны имени файла, не a ksh
расширенный один (что bash
(и bash
только, нет 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
.
Простые цитаты не расширяют $
переменную. Вы должны использовать двойные кавычки:
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")
Если ваши вычисления BC несколько связаны, вы также можете использовать здесь документы, чтобы сделать его более читаемым:
var2=500
bc << EOF
scale=2
$var2 + 100
EOF
вычисляется
600
Сообщение об ошибке означает, что у вас есть буквальный знак доллара на вашем входе на 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
масштабирование по какой-то причине, вы можете использовать другую версию.
Выражение не расширяется из-за единых галочек
.
Используйте что-то вроде:
var3=$(bc <<< "scale=2; $var2")