Длинный путь вокруг. Но ради удовольствия:
1.
Создайте временное изображение:
$ truncate -s64MiB tmp.img
2.
Создайте два использования разделов fdisk
:
Скорее подробный, но хорошо.
$ fdisk tmp.img
Первый раздел:
: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>
Второй раздел:
: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)
Печать, что мы собираемся записать:
: x
: p
Nr AF Hd Sec Cyl Hd Sec Cyl Start Size ID
1 00 32 33 0 57 52 5 2048 81920 83
2 00 57 53 5 40 32 8 83968 47104 83
Запись и выход:
:w (Dont! forget ;-) )
У нас есть два раздела 40 и 23 мебибайт:
81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB
3.
Создайте две файловых системы:
truncate -s40MiB ext4.img
truncate -s23MiB ext3.img
mke2fs -t ext4 -F -L part_ext4 ext4.img
mke2fs -t ext3 -F -L part_ext3 ext3.img
4.
Сшейте все это вместе:
Извлечение сначала 2048*512
байты из временного изображения:
dd if=tmp.img of=disk.img bs=512 count=2048
Объедините их:
cat ext4.img ext3.img >> disk.img
Отлично.
Если слова расположены в каждой строке, то можно использовать awk,
awk '$0 >= 03509999999 && $0 <= 03999999999 {next;}{print}' file
Я использовал драйвер для < 3.4 ядра и у меня есть 3.13. Я скачал новый драйвер. Я видел «3.1.3»...
-121--89385- Как уже говорили другие, ваши если тест...; fi
синтаксически неверны, но также стоит отметить, что весь ваш подход немного грубый. Есть пара областей, в которых поток этого сценария может быть резко улучшен - в частности, в том, что его будет легче читать и редактировать позже.
Сначала можно задать
параметры выбора итеративно в цикле для
. В этом пути любой возможный выбор будет объявлен пользователю и автоматически сгенерирован его селектор, но в сценарии вы можете объединить их в список последовательностей, не беспокоясь ни о:
set --
for c in \
"Base install:base_fn" \
"Mintrepos:mint_fn" \
"Asusn13 driver:asus_fn" \
"Install Standard openbox:std_obox_fn" \
"Install Xfceopenbox:xfce_obox_fn" \
"backing up standard open box config:bkup_fn obox" \
"backing up openboxfce:bkup_fn xfce"
do
set -- "$@" "${c##*:}"
printf "'%s' = $#\n" "${c%:*}"
done
Это кодирует вызываемое fn _ name
в массив позиционных параметров, одновременно печатая понятное пользователю описание stdout.
После создания списка выбранных элементов в «$ @»
и печати хода выполнения, можно прочитать
выбранные пользователем элементы в небольшом цикле, который будет закрыт после слишком большого количества неудачных попыток, а также проверить их ввод:
chk=$((($#<1)*5)) #if not at least one choice quit
until [ "$((chk+=1))" -gt 5 ] && exit 1 #chks up to 5 times or quits
printf '\nSelect: ' #prompts for each try
read -r c && [ -n "${c##*[!0-9]*}" ] #fails if input not number or empty
do echo "Invalid selection."; done #prints a notice and retries
В последний раз можно просто сдвинуть
все ненужные параметры и вызвать $1
:
shift "$((c-1))"; $1
Лучше проверить, нет ли начальных нулей. shift
приведет к ошибке, если пользователь выбрал слишком большое число.
[ "$((c=$(printf %.d "$c")))" -gt 0 ] || exit
shift "$((c-1))" && $1
Это для числового списка выбора, что делает позиционный массив очень полезным. В более общем случае можно использовать оператор case
:
case "$choice" in
(pattern 1) do as necessary for a match;;
(pattern 2) do otherwise for this match;;
(pattern 3) continue this wise for each;;
(*) until there isn't a match ;;
esac
Это только переносимые средства эмуляции того, что многие оболочки (включая bash
) предложат в качестве оператора select
, введенного ksh
много лет назад.
Из man bash
:
выберите
name [ в
word ]; сделать
список ; done
«$ @»
) (см. ПАРАМЕТРЫ ниже). Появится подсказка $ PS3
и строка, считанная из стандартного ввода. Если предполагается, что слова находятся в одной строке и отсортированы, можно выполнить следующие действия:
head --lines 509999999 input_file
Если файл выглядит следующим образом:
03000000000 03509999998 03509999999 03510000000 03999999998
03000000001 03999999999 03000000002
(т. е. несортированные и несколько записей в строке) можно использовать следующий питон программа:
import sys
def read(fp):
buf = ""
while True:
if ' ' in buf or '\n' in buf:
try:
word, buf = buf.split(None, 1)
except ValueError:
word, buf = buf.strip(), ""
if word:
yield word
if not buf:
buf = fp.read(100)
if not buf:
yield None
with open(sys.argv[1]) as fp:
for x in read(fp):
if x is None:
break
if sys.argv[2] <= x <= sys.argv[3]:
continue
print x
начать с python test.py inputfile 03509999999 03999999999
. На выходе будут слова в том же порядке, что и в оригинале, но все они будут разделены новой строкой.