Чтобы проверить, является ли аргумент скрипта 1
или 2
, вы можете просто использовать оператор case.
В приведенном ниже коде предполагается, что вы хотите проверить$1
:
case $1 in
[12])
# $1 is 1 or 2
;;
*)
# $1 is not 1 and not 2
esac
Нет реальной необходимости проверять, является ли аргумент допустимым целым числом или нет, так как вас интересуют только два конкретных значения, и их можно легко проверить как строки. Значения переменных оболочки всегда являются строками, если они не используются в арифметическом контексте, и здесь нет причин делать это.
Вы также можете использовать явный оператор if
:
if [ "$1" = '1' ] || [ "$1" = '2' ]; then
# $1 is 1 or 2
else
# $1 is not 1 and not 2
fi
Убийцей является использование двух процессов.
С cat | pv
, cat
чтение и запись, и pv
чтение и запись, и оба процесса должны работать:
$ perf stat sh -c 'cat /dev/zero | pv -s 100G -S > /dev/null'
100GiB 0:00:26 [3.72GiB/s] [====================================================================================>] 100%
Performance counter stats for 'sh -c cat /dev/zero | pv -s 100G -S > /dev/null':
34,048.63 msec task-clock # 1.267 CPUs utilized
1,676,706 context-switches # 0.049 M/sec
3,678 cpu-migrations # 0.108 K/sec
304 page-faults # 0.009 K/sec
119,270,941,758 cycles # 3.503 GHz (74.89%)
137,822,862,590 instructions # 1.16 insn per cycle (74.94%)
32,379,369,104 branches # 950.974 M/sec (75.14%)
216,658,446 branch-misses # 0.67% of all branches (75.04%)
26.865741948 seconds time elapsed
1.257950000 seconds user
38.893870000 seconds sys
Только с pv
есть только pv
чтение и запись, переключение контекста не требуется (или почти не требуется):
$ perf stat sh -c '< /dev/zero pv -s 100G -S > /dev/null'
100GiB 0:00:07 [13.3GiB/s] [====================================================================================>] 100%
Performance counter stats for 'sh -c < /dev/zero pv -s 100G -S > /dev/null':
7,501.68 msec task-clock # 1.000 CPUs utilized
37 context-switches # 0.005 K/sec
0 cpu-migrations # 0.000 K/sec
198 page-faults # 0.026 K/sec
27,916,420,023 cycles # 3.721 GHz (75.00%)
62,787,377,126 instructions # 2.25 insn per cycle (74.99%)
15,361,951,954 branches # 2047.801 M/sec (75.03%)
51,741,595 branch-misses # 0.34% of all branches (74.98%)
7.505304560 seconds time elapsed
1.768600000 seconds user
5.733786000 seconds sys
Существует некоторый параллелизм («Используется 1,267 ЦП» ), но он не компенсирует огромную разницу в количестве переключений контекста.
Все могло быть и хуже, учитывая путь данных — в первом случае кажется, что данные перетекают из ядра(/dev/zero
)в cat
, обратно в ядро (по каналу ), в pv
, к ядру (/dev/null
). Во втором случае данные перетекают из ядра в pv
и обратно в ядро. Но в первом сценарии pv
используетsplice
для копирования данных из канала, избегая обхода памяти, принадлежащей ядру -.