Gilles точно прав, ls
действительно плохой пример, потому что расширение шарика имени файла может быть сделано намного легче на командной строке, не имея необходимость использовать ls
вообще! Если Ваши так называемые "текстовые файлы" имеют расширения файла для идентификации их, Вы могли бы сделать что-то вроде этого:
editor-command *.txt
Ради демонстрации техники, позволяет, используют более сложный пример, который не мог быть, покончили просто соответствие имени файла и открытые файлы на основе содержания вместо просто имени файла. Позволяет говорят, что Вы хотели открыть все файлы, которые содержали строку "тип контента".
Принятие Вашего редактора будет принимать несколько имен файлов и открывать их внезапно в отдельных буферах или последовательно работать, это - путь через них, можно просто работать:
editor-command $(grep -i content-type)
Теперь назад к Вашему исходному вопросу, позволяет, говорят, что Вы не знаете, являются ли они текстовыми файлами или не на основе их имен. Необходимо было бы затем использовать другую программу для идентификации их, затем открыть их на основе тех данных. Программа file
скажет Вам, какой файл что-то, и Вы можете grep, которые перечисляют для просто текстовых файлов и затем открывают просто имена файлов соответствия как это:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
Вывод цепочки команды в $()
конструкция будет использоваться в качестве аргументов в пользу редактора. Я иногда делаю это на двух этапах. Скажите, что я просматриваю некоторый набор файлов и вовлекаю себя список каждого XML-файла, содержащего строку "тип контента"
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
... и решите, что я хочу открыть их. Я затем использую последний ярлык истории команд и делаю это:
vim $(!!)
... открыть все результаты предыдущей команды в энергии, моем любимом редакторе.
Если Ваш редактор только примет один файл за один раз, и необходимо продолжать извергать редакторов, необходимо будет использовать вариант любого xargs
или for
цикл в ответе jmtd в зависимости от того, используете ли Вы на терминальном основанного редактора, которому нужен stdio.
То, что Вы сделали, должно было работать; это выполняет bc
как указано POSIX. Однако до н.э относительно мало - используемый инструмент и некоторые реализации могут быть багги. Если Вы не используете математических функций, более усовершенствованных, чем +-*/
и сравнения, можно использовать awk
; даже исходная реализация A, W и K поддерживала арифметику с плавающей точкой.
echo 3.2 | awk '{exit !($0 > 3)}'
expr может обработать сравнения плавающие как этот, очень хорошо.
ksh -c '(( $(expr 3.2 \> 3) == 1 )) && echo 1 || echo 0'
или используйте его в сценарии, как:
#!/usr/bin/ksh
if [ $(expr $1 \> $2) == 1 ]; then
echo "greater"
else
echo "lesser"
fi
можно найти, что expr является более портативным, потому что до н.э строка, которую Вы используете выше работ над Linux, но не над solaris., использующим expr, должна работать то же над любым из тех Ose.
expr
по-видимому, делает сравнение строк, как expr 3.0 \> 3
дает 1 (верный) и expr 3.0 = 3
дает 0 (ложь). Около этого нет никакой потребности к внешней проверке: if expr $1 \> $2 > /dev/null; then echo "greater"; else echo "lesser"; fi
.
– manatwork
25.10.2011, 19:14
echo 3.2 3 | awk '{if ($1 > $2) print "1"; else print "0";}'
– Tim Kennedy
25.10.2011, 20:35
При наличии попробовать dc
:
echo "2 k 3.2 3 [1p] sa <a" | dc
Обратите внимание, что вышеупомянутое будет также использовать 2 десятичной точности и произведет 1, если первое число (3.2 в вышеупомянутом примере) будет больше, чем второе число (3 выше). Но иначе ничего не произведет.
dc
bc
брат, в документации GNU описал с теми же “словами” калькулятора произвольной точности. В некоторых дистрибутивах они поставляются в том же пакете, в других дистрибутивах они упаковываются отдельно.