Использование (), (()), [], [[]], {} в Shell

Linux Shell

() использование

подоболочка

() Открыть подоболочку, внешний слой не затрагивается

#!/bin/bash
pwd
(cd /etc;pwd)
pwd

вывод:
/home/atvoid/Документы/Мое ореховое облако/проект/ShellLife
/etc
/home/atvoid/Документы/Мое ореховое облако/проект/ShellLife

Выполните команду $()

Эквивалентно ``, но рекомендуется $()

a=$(echo 123)
echo $a #输出123

Инициализировать массив/словарь

#!/bin/bash
array=(a b c d)
echo ${array[*]}

declare  -A dict=([k1]="v1" [k2]="v2")
echo ${dict[*]}

вывод
a b c d
v1 v2

[ ] использование

Внутренний символ Эквивалент теста Обычно не используется

Единственными операторами сравнения, доступными в test и [], являются == и !=, оба они используются для сравнения строк, а не для целочисленного сравнения.Целочисленное сравнение может использовать только форму -eq, -gt. Ни сравнение строк, ни сравнение целых чисел не поддерживают знак «больше» и «меньше». Если вы действительно хотите его использовать, вы можете использовать экранированную форму для сравнения строк. Если вы сравниваете «ab» и «bc»:[ ab \< bc ], результат верный. Логическое И и логическое ИЛИ в [ ] выражаются с помощью -a и -o Уведомление:

  1. Вы должны добавить пробел справа от открывающей скобки и пробел слева от закрывающей скобки, иначе будет сообщено об ошибке.
  2. Команда test использует стандартную математическую нотацию сравнения для сравнения строк и текстовую нотацию для числового сравнения. Многие люди помнят его задом наперед. Используйте реверс, оболочка может не получить правильный результат.
  3. Символы больше или меньше должны быть экранированы, иначе они будут интерпретированы как перенаправление.
#!/bin/bash
a=1
b=2
if [ $a -lt $b ]; then
  echo a小于b
fi

a="a"
b="b"
if [ $a != $b ]; then
  echo a不等于b
fi

разное

массив элементов массива ссылок[1]
Обычный [0-9]

(( )) и [[ ]] Обычно используются

Это расширенные версии [ ] для выражений математического сравнения и строковых выражений соответственно. Среди них (( )), в выражении нет необходимости экранировать символы больше или меньше. Помимо стандартных математических операторов, также добавляются следующие символы:

В [[ ]] добавлена ​​еще одна функция: сопоставление с образцом.

(()) и $(())

  1. Целочисленное расширение.Этот тип вычисления расширения является вычислением целочисленного типа и не поддерживает тип с плавающей запятой.((exp))Структура расширяет и оценивает арифметическое выражение. Если результат выражения равен 0, возвращаемый код состояния выхода равен 1 или "false", а код состояния выхода, возвращаемый выражением с ненулевым значением, будет равен 0 или " истинно». Если это логическое суждение, выражение exp равно 1, если оно истинно, и 0, если оно ложно.
  2. Пока операторы и выражения в круглых скобках соответствуют правилам операций языка C, их можно использовать.在$((exp)), даже тернарный оператор. При выполнении операций с различным переносом (например, двоичным, восьмеричным и шестнадцатеричным) все выходные результаты автоматически преобразуются в десятичные. как:echo $((16#5f))Результат 95 (шестнадцатеричный в десятичный)
  3. просто используйте(( ))Вы также можете переопределить значения переменных, напримерa=5; ((a++))$a можно переопределить как 6
  4. Обычно используется для сравнения арифметических операций, переменные в двойных скобках использовать нельзя.$Префикс символа. Несколько выражений в круглых скобках поддерживаются через запятую. Если выражение в круглых скобках соответствует, например, правилам работы языка C, его можно использовать напрямую.for((i=0;i<5;i++)), если двойные скобки не используются, тоfor i in $(seq 0 4)илиfor i in {0..4}. Кроме того, вы можете использовать его напрямуюif (($i<5)), если двойные скобки не используются, тоif [ $i -lt 5 ].
#!/bin/bash
#重新定义变量
a=5
((a++))
echo $a # 输出6

#for循环
for ((i = 0; i < 5; i++)); do
  echo 当前序号: $i
done

#条件判断
if ((1 + 2)); then
  echo 真
fi

if !((1 - 1)); then
  echo 假
fi

#算数运算
echo $((1 + 2 * 3)) # 输出7

[[]]

  1. [[ключевое слово в языке программирования bash. не команда,[[ ]]коэффициент структуры[ ]Структура более общая. Все символы между [[ и ]] не имеют расширения имени файла или разделения слов, но расширение параметров и подстановка команд будут иметь место.
  2. Поддерживает сопоставление строк с образцом и даже регулярные выражения оболочки при использовании оператора =~. При сравнении строк правая часть может использоваться как образец, а не просто строка, чем如[[ hello == hell? ]], результат верный.[[ ]]соответствует строке или подстановочному знаку в , кавычки не требуются.
  3. использовать[[ ... ]]Структура условного суждения, не[ ... ], что предотвращает множество логических ошибок в скрипте. Например, операторы &&, ||, могут нормально существовать в[[ ]]Условная структура суждения, но если она появляется в[ ]Если он есть в структуре, он сообщит об ошибке. Например, вы можете напрямую использоватьif [[ $a != 1 && $a != 2 ]], если двойные скобки не используются, тоif [ $a -ne 1] && [ $a != 2 ]илиif [ $a -ne 1 -a $a != 2 ].
  4. Bash обрабатывает выражение, заключенное в двойные квадратные скобки, как один элемент и возвращает код состояния выхода.
#!/bin/bash
if [[ hello == hell? ]];then
  echo 'hello == hell?  true'
fi

if [[ 5 > 4 ]];then
  echo '5 > 4 true'
fi


if [[ 123 =~ ^[0-9]+ ]];then
  echo '123 match ^[0-9]+'
fi

Использование {}

замена переменной ${}

#!/bin/bash
array=(a b c d)
#  echo $array[*]   会输出a[*]
echo ${array[*]} # 可以输出a b c d

специальная замена

  • ${var:-string}/${var:=string}

    Если переменная var пуста, замените ее строкой в ​​командной строке.${var:-string}, в противном случае, когда переменная var не пуста, заменить ее значением переменной var${var:-string};за${var:=string}правила замены и${var:-string}то же самое, разница${var:=string}Если переменная пуста, замените ее строкой.${var:=string}В то же время присвойте строку переменной var.${var:=string}Очень распространенное использование - определить, присвоено ли переменной значение, и, если нет, присвоить ей значение по умолчанию.

  • ${var:+string}

    Вопреки вышесказанному, то есть только когда var не пустая, она будет заменена строкой, если var пустая, она не будет заменена или заменена значением переменной var, то есть пустым значением. (Поскольку в данный момент переменная var пуста, эти два оператора эквивалентны)

  • ${var:?string}

    Если переменная var не пуста, замените ее значением переменной var${var:?string}; если переменная var пуста, вывести строку в стандартную ошибку и выйти из скрипта. Мы можем использовать эту функцию, чтобы проверить, установлено ли значение переменной.

Извлечение и замена строки

  • ${var:num}

    0 считает от числа до конца

  • ${var:num1:num2}

    Начать с num1, извлечь num2, считать 0

  • ${var/pattern/pattern}

    заменить первый

  • ${var//pattern/pattern}

    заменить все

var="01234560"
echo $var #01234560

echo ${var:5} #560

echo ${var: -6} #234560

echo ${var:(-6)} #234560

echo ${var:1:4} #1234

echo ${var/0/-1} #-11234560

echo ${var//0/-1} #-1123456-1

Четыре структуры замены, соответствующие шаблону

#это убрать левый (# на клавиатуре слева от $)

%это убрать правый (% на клавиатуре справа от $)

#и%Одиночный символ — это наименьшее совпадение, два одинаковых символа — наибольшее совпадение.

  • ${var#pattern}

    ${variable#pattern} В этом шаблоне оболочка просматривает переменную, чтобы увидеть, начинается ли она с заданного шаблона шаблона.Если это так, удалите самый короткий соответствующий шаблон слева из содержимого переменной из командной строки.

  • ${var##pattern}

    ${variable##pattern} В этом шаблоне оболочка просматривает переменную, чтобы увидеть, заканчивается ли она заданным шаблоном шаблона.Если это так, удалите самый длинный соответствующий шаблон справа из содержимого переменной из командной строки.

  • ${var%pattern}

    ${variable%pattern}, в этом шаблоне оболочка просматривает переменную, чтобы увидеть, заканчивается ли она заданным шаблоном шаблона, если да, удаляет самый короткий соответствующий шаблон справа из содержимого переменной из командной строки

  • ${var%%pattern}

    ${variable%%pattern}, в этом режиме оболочка просматривает переменную, чтобы увидеть, заканчивается ли она заданным шаблоном шаблона, если да, удаляет самый длинный совпадающий шаблон справа из содержимого переменной из командной строки

var=testcase
echo $var  #testcase
echo ${var%s*e} #testca

echo ${var%%s*e} #te

echo ${var#?e} #stcase
echo ${var##?e}#stcase

echo ${var##*e} #空
echo ${var##*s} #e
echo ${var##test} #case

Указывает диапазон

touch {a..d}.txt

Результат: a.txt b.txt c.txt d.txt