() использование
подоболочка
() Открыть подоболочку, внешний слой не затрагивается
#!/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
Уведомление:
- Вы должны добавить пробел справа от открывающей скобки и пробел слева от закрывающей скобки, иначе будет сообщено об ошибке.
- Команда test использует стандартную математическую нотацию сравнения для сравнения строк и текстовую нотацию для числового сравнения. Многие люди помнят его задом наперед. Используйте реверс, оболочка может не получить правильный результат.
- Символы больше или меньше должны быть экранированы, иначе они будут интерпретированы как перенаправление.
#!/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]
(( )) и [[ ]] Обычно используются
Это расширенные версии [ ] для выражений математического сравнения и строковых выражений соответственно. Среди них (( )), в выражении нет необходимости экранировать символы больше или меньше. Помимо стандартных математических операторов, также добавляются следующие символы:
В [[ ]] добавлена еще одна функция: сопоставление с образцом.(()) и $(())
- Целочисленное расширение.Этот тип вычисления расширения является вычислением целочисленного типа и не поддерживает тип с плавающей запятой.
((exp))
Структура расширяет и оценивает арифметическое выражение. Если результат выражения равен 0, возвращаемый код состояния выхода равен 1 или "false", а код состояния выхода, возвращаемый выражением с ненулевым значением, будет равен 0 или " истинно». Если это логическое суждение, выражение exp равно 1, если оно истинно, и 0, если оно ложно. - Пока операторы и выражения в круглых скобках соответствуют правилам операций языка C, их можно использовать.
在$((exp))
, даже тернарный оператор. При выполнении операций с различным переносом (например, двоичным, восьмеричным и шестнадцатеричным) все выходные результаты автоматически преобразуются в десятичные. как:echo $((16#5f))
Результат 95 (шестнадцатеричный в десятичный) - просто используйте
(( ))
Вы также можете переопределить значения переменных, напримерa=5; ((a++))
$a можно переопределить как 6 - Обычно используется для сравнения арифметических операций, переменные в двойных скобках использовать нельзя.
$
Префикс символа. Несколько выражений в круглых скобках поддерживаются через запятую. Если выражение в круглых скобках соответствует, например, правилам работы языка 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
[[]]
-
[[
ключевое слово в языке программирования bash. не команда,[[ ]]
коэффициент структуры[ ]
Структура более общая. Все символы между [[ и ]] не имеют расширения имени файла или разделения слов, но расширение параметров и подстановка команд будут иметь место. - Поддерживает сопоставление строк с образцом и даже регулярные выражения оболочки при использовании оператора =~. При сравнении строк правая часть может использоваться как образец, а не просто строка, чем
如[[ hello == hell? ]]
, результат верный.[[ ]]
соответствует строке или подстановочному знаку в , кавычки не требуются. - использовать
[[ ... ]]
Структура условного суждения, не[ ... ]
, что предотвращает множество логических ошибок в скрипте. Например, операторы &&, ||, могут нормально существовать в[[ ]]
Условная структура суждения, но если она появляется в[ ]
Если он есть в структуре, он сообщит об ошибке. Например, вы можете напрямую использоватьif [[ $a != 1 && $a != 2 ]]
, если двойные скобки не используются, тоif [ $a -ne 1] && [ $a != 2 ]
илиif [ $a -ne 1 -a $a != 2 ]
. - 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