TCSH поразрядно | оператор

ls -R помещает некоторые дополнительные пустые строки в вывод, который заставляет количество увеличиваться.

Можно протестировать его путем выполнения команды ls -R не передавая его по каналу к wc -l

0
27.12.2013, 01:23
2 ответа

Вы действительно хотите сделать это в tcsh только? Csh и его производная tcsh имеют много таких причуд. Вы более обеспечены с другой оболочкой как удар и т.д.

В данном случае кажется, что добавление пары круглой скобки угождает tcsh. Это также документируется в tcsh руководство:

expr может содержать операторы *, +, и т.д., как в C. Если expr содержит <, >, & или | затем, по крайней мере, та часть expr должна быть помещена в ().

mint13:~> echo $version
tcsh 6.17.06 (Astron) 2011-04-15 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,nd,color,filec
mint13:~> @ y = 1001; @ z = 0110;
mint13:~> @ x = $y|$z
110: Command not found.
mint13:~> @ x = ($y|$z)
mint13:~> echo $x
1007

Вы могли бы уже знать, это — tcsh читает 1001 и 0110 как десятичные числа. Я не знаю, как заставить его понять двоичные числа.

2
28.01.2020, 02:37
  • 1
    Спасибо за ответ. Становится все больше очевидно, что расхожее мнение, что tcsh непоследователен, верно. Будет переключаться скоро. –  adiles 26.12.2013, 10:39

Я не знаю, как объявлять двоичные числа; но ваш синтаксис неверен.

У '@' был собственный анализатор выражений, и каким-то образом он путался с основным анализатором, если выражение не заключено в скобки. Согласно справочной странице -, в некоторых случаях требуются пробелы, включающие побитовые операторы. Я предлагаю использовать пробелы везде, так как там было много ошибок.

Это будет работать гладко:

@ y = 1001; @ z = 0110;
@ x = ( $y | $z ); echo $x

Обратите внимание, что, как и в C, числа, начинающиеся с 0, являются восьмеричными, поэтому значение $z равно 72 в десятичном виде.

Восьмеричные и шестнадцатеричные числа используются потому, что они точно представляют двоичные числа. Восьмеричная цифра представляет 3 двоичных цифры.

binary <--> octal
   000         0
   001         1
   010         2
   011         3
   100         4
   101         5
   110         6
   111         7

Если значения y и z, которые вы записали, представлены в двоичном формате, это правильная форма (с использованием восьмеричных чисел)

@ y = 011; @z = 006;
@ x = ( $y | $z ); echo $x
15

Существует еще одно решение: используйте любую команду -строкового калькулятора, которую вы хотите, используя выражение в обратных -кавычках. Я предлагаю попробоватьcalc , bc или awk с этим порядком.

Пример с вычислением:

set x = `calc '0b1001 | 0b110'`; echo $x
15

15 (дес )= 017 (окт )= 0xF (шестн )= 0b1111 (бин)

0
28.01.2020, 02:37

Теги

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