Как использовать двойные или одинарные скобки, скобки, фигурные скобки

Мне недавно понадобилось сделать это для дочернего процесса Java, работающего в тюрьме. Это означало, что у него не было доступа к файловой системе / dev / fd.

@Bozho сделал комментарий, что отражение может или не может работать для создания объекта FileDescriptor. Однако, похоже, он работает в простом тесте. Ниже приведен источник для TestFD.java:

import java.lang.reflect.Constructor;
import java.io.FileDescriptor;
import java.io.FileOutputStream;

public class TestFD {
  public static void main(String[] args) throws Exception {
    Constructor<FileDescriptor> ctor = FileDescriptor.class.getDeclaredConstructor(Integer.TYPE);
    ctor.setAccessible(true);
    FileDescriptor fd = ctor.newInstance(3);
    ctor.setAccessible(false);

    new FileOutputStream(fd).write("hi there\n".getBytes());
  }
}

Чтобы проверить это, я создал простой скрипт Bash, который его компилирует, устанавливает fd3 и запускает java-программу:

#!/bin/bash

javac TestFD.java

exec 3>&1  # open fd3, redirect to stdout
java TestFD
exec 3>&-

Конечно, fd3 перенаправляется на stdout и выводит «hi there there\n» на терминал. Прокомментируйте строку «exec 3> & amp; 1», и программа Java завершится неудачно, как ожидалось, с «IOException», не настроенным на устройство.

Отражение в частном конструкторе FileDescriptor, похоже, отлично работает в тех случаях, когда доступ к / dev / fd невозможно, и он менее суровый, чем попытка создания FileDescriptor с использованием JNI, предложение, которое я видел в другом месте.

Примечание. Я тестировал это в системе BSD. Он может работать или не работать в других системах.

621
задан codeforester 25 May 2018 в 18:24
поделиться

3 ответа

В Bash test и [ являются встроенными командами оболочки.

Двойная скобка , которая является ключевым словом оболочки, обеспечивает дополнительные функции. Например, вы можете использовать && и || вместо -a и -o , и есть оператор сопоставления регулярных выражений ] = ~ .

Кроме того, в простом тесте двойные квадратные скобки дают оценку намного быстрее, чем одиночные.

$ time for ((i=0; i<10000000; i++)); do [[ "$i" = 1000 ]]; done

real    0m24.548s
user    0m24.337s
sys 0m0.036s
$ time for ((i=0; i<10000000; i++)); do [ "$i" = 1000 ]; done

real    0m33.478s
user    0m33.478s
sys 0m0.000s

Фигурные скобки, помимо ограничения имени переменной, используются для раскрытия параметра , поэтому вы можете делать такие вещи, как:

  • Усекать содержимое переменной

     $ var = "abcde"; echo $ {var% d *} 
    abc 
     
  • Сделайте замены, аналогичные sed

     $ var = "abcde"; echo $ {var / de / 12} 
    abc12 
     
  • Использовать значение по умолчанию

     $ default = "hello"; unset var; echo $ {var: - $ default} 
    hello 
     
  • и еще несколько

Кроме того, расширения скобок создают списки строк, которые обычно повторяются циклами:

$ echo f{oo,ee,a}d
food feed fad

$ mv error.log{,.OLD}
(error.log is renamed to error.log.OLD because the brace expression
expands to "mv error.log error.log.OLD")

$ for num in {000..2}; do echo "$num"; done
000
001
002

$ echo {00..8..2}
00 02 04 06 08

$ echo {D..T..4}
D H L P T

Обратите внимание, что функции начального нуля и приращения не были доступны до Bash 4.

Спасибо gboffi за напоминание мне о расширениях скобок.

Двойные круглые скобки используются для арифметических операций :

((a++))

((meaning = 42))

for ((i=0; i<10; i++))

echo $((a + b + (14 * c)))

и позволяют опускать знаки доллара в целочисленных переменных и переменных массива и включать пробелы вокруг операторов для удобства чтения.

Одиночные скобки также используются для массивов индексов:

array[4]="hello"

element=${array[index]}

Фигурные скобки необходимы для (большинства / всех?) Ссылок на массив с правой стороны. Комментарий

ephemient напомнил мне, что скобки также используются для подоболочек. И что они используются для создания массивов.

array=(1 2 3)
echo ${array[1]}
2
581
ответ дан 22 November 2019 в 21:51
поделиться
  1. Одиночная скобка ( [) обычно вызывает программу с именем [; man test или man [ для получения дополнительной информации. Пример:

     $ VARIABLE = abcdef 
     $ if [$ VARIABLE == abcdef]; тогда эхо да; иначе эхо нет; fi 
    yes 
     
  2. Двойная скобка ( [[]) делает то же самое (в основном), что и одиночная скобка, но является встроенной функцией bash.

     $ VARIABLE = abcdef 
     $ if [[$ VARIABLE == 123456]]; тогда эхо да; иначе эхо нет; fi 
    no 
     
  3. Круглые скобки ( () ) используются для создания подоболочки. Например:

     $ pwd 
     / home / user 
     $ (cd / tmp; pwd) 
     / tmp 
     $ pwd 
     / home / user 
     

    Как видите, подоболочка позволяла выполнять операции, не затрагивая среду текущей оболочки.

  4. (a) Фигурные скобки ( {} ) используются для однозначной идентификации переменных. Пример:

     $ VARIABLE = abcdef 
     $ echo Переменная: $ VARIABLE 
    Переменная: abcdef 
     $ echo Переменная: $ VARIABLE123456 
    Переменная: {{1} } $ echo Переменная: $ {VARIABLE} 123456 
    Переменная: abcdef123456 
     

    (b) Фигурные скобки также используются для выполнения последовательности команд в текущем контексте оболочки , например

     $ {дата; top -b -n1 | глава ; }> logfile 
     # вывод 'date' и 'top' объединены, 
     # иногда может быть полезно для поиска верхнего загрузчика) 
     
     $ {date ; сделать 2> & 1; Дата; } | tee logfile 
     # теперь мы можем вычислить продолжительность сборки из файла журнала 
     

Однако есть тонкая синтаксическая разница с () (см. ссылка на bash ); по сути, точка с запятой ; после последней команды в фигурных скобках является обязательной, а фигурные скобки {, } должны быть окружены пробелами.

326
ответ дан 22 November 2019 в 21:51
поделиться

Я просто хотел добавить их из TLDP :

~:$ echo $SHELL
/bin/bash

~:$ echo ${#SHELL}
9

~:$ ARRAY=(one two three)

~:$ echo ${#ARRAY}
3

~:$ echo ${TEST:-test}
test

~:$ echo $TEST


~:$ export TEST=a_string

~:$ echo ${TEST:-test}
a_string

~:$ echo ${TEST2:-$TEST}
a_string

~:$ echo $TEST2


~:$ echo ${TEST2:=$TEST}
a_string

~:$ echo $TEST2
a_string

~:$ export STRING="thisisaverylongname"

~:$ echo ${STRING:4}
isaverylongname

~:$ echo ${STRING:6:5}
avery

~:$ echo ${ARRAY[*]}
one two one three one four

~:$ echo ${ARRAY[*]#one}
two three four

~:$ echo ${ARRAY[*]#t}
one wo one hree one four

~:$ echo ${ARRAY[*]#t*}
one wo one hree one four

~:$ echo ${ARRAY[*]##t*}
one one one four

~:$ echo $STRING
thisisaverylongname

~:$ echo ${STRING%name}
thisisaverylong

~:$ echo ${STRING/name/string}
thisisaverylongstring
23
ответ дан 22 November 2019 в 21:51
поделиться
Другие вопросы по тегам:

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