Разработка встроенных систем Linux — сценарий оболочки
Разработка встроенных систем Linux — сценарий оболочки

Каталог статей

Разработка встроенных систем Linux — сценарий оболочки

После нашего предыдущего исследования мы смогли вводить команды в терминал для выполнения некоторых распространенных операций, но мы всегда вводим команды одну за другой. Если команд нужно выполнить слишком много, это будет очень хлопотно. Итак, есть ли способ поместить множество команд в файл, а затем напрямую запустить файл для выполнения этих команд? Конечно, есть, это сценарий оболочки, который мы представим дальше!

Сценарий оболочки аналогичен пакетному файлу Windows, который записывает в файл последовательно выполняемые команды. Сценарии оболочки предоставляют такие функции, как массивы, циклы и условные оценки, которые обычно требуются для эксплуатации и обслуживания Linux или системным администраторам. Однако, как разработчикам встроенных систем, нам нужно освоить только самые основные части сценариев оболочки.

1. Основные принципы работы скриптов оболочки

Сценарий оболочки представляет собой обычный текстовый файл, в котором команды выполняются сверху вниз, строка за строкой. Сценарии оболочки имеют расширение .sh. И первая строка сценария оболочки должна быть:

Язык кода:javascript
копировать
#!/bin/bash

Это означает использование bash.

2. Синтаксис сценария оболочки

2.1. Написать сценарий оболочки.

Далее давайте напишем первый простой сценарий оболочки. Его основная функция — отображать в терминале «привет, мир!». Давайте теперь посмотрим на конкретный код!

Язык кода:javascript
копировать
#!/bin/bash
echo "hello world!"

Но давайте посмотрим на разрешения этого .sh-файла!

Язык кода:javascript
копировать
-rw-rw-r-- 1 ygr ygr 32  январь 26 15:08 my.sh

Мы видим, что этот файл не является исполняемым, поэтому изменяем разрешения, чтобы сделать его исполняемым.

Язык кода:javascript
копировать
chmod 777 my.sh

Далее давайте выполним этот файл и посмотрим, каков будет окончательный результат. Мы видим, что наш «привет, мир!» наконец-то был выведен.

Язык кода:javascript
копировать
ygr@ygr-виртуальная-машина:~/Desktop$ ./my.sh 
hello world!

2.2. Интерактивный скрипт оболочки.

Далее мы коснемся интерактивных сценариев. Мы уже научились печатать в терминале. Далее научимся вводить. Используемая нами команда — это команда чтения. Давайте посмотрим на наш конкретный код:

Язык кода:javascript
копировать
#!/bin/bash
echo "please input name:"
read name
echo "your name:" $name

Затем запустите эффект:

Язык кода:javascript
копировать
please input name:
chenyi
your name: chenyi

Наша команда чтения может добавлять множество параметров, мы кратко представим только один, а остальные вы сможете просмотреть самостоятельно.

Язык кода:javascript
копировать
#!/bin/bash
read -p "please input name and age: " name age
echo "your name = $name, your age = $age."

Эта команда используется для запроса пользователя при вводе текста. Давайте посмотрим на результаты работы:

Язык кода:javascript
копировать
please input name and age: chenyi 30
your name = chenyi, your age = 30.

2.3. Численный расчет сценария оболочки.

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

Язык кода:javascript
копировать
#!/bin/bash
echo "please input two int num: "
read -p "first num: " first
read -p "second num: " second
total=$(($first + $second))
echo "$first + $second =  $total"

Результаты запуска:

Язык кода:javascript
копировать
please input two int num: 
first num: 4
second num: 6
4 + 6 =  10

2.4. тестовая команда

Команда тестирования в основном используется для проверки существования файла, разрешений и другой информации.,Возможны числовые значения,характер,Три аспекта тестирования документов. до этого,Давайте сначала представим его&&и||Эти две команды:

&&оператор

мы знаем,“&&”существоватьCНа языке это означает «и».,Но в синтаксисе оболочки,Это не означает и,Но что-то похожее,Давайте рассмотрим следующий пример.

“cmd1 && cmd2” Это означает, что если cmd1 выполняется правильно, то начинает выполняться cmd2. Если cmd1 выполняется неправильно, то cmd2 не выполняется. Можно только сказать, что это немного похоже на короткое замыкание в языке C. Давайте представим это дальше || оператор。

|| оператор

Мы знаем, что «||» означает «или» на языке C, но в синтаксисе оболочки это означает не «или», а «или».

“cmd1 || cmd2” Это означает, что если cmd1 выполнен корректно и корректно, cmd2 не будет выполнен, в противном случае будет выполнен cmd2. Это означает выполнение одного из двух, поэтому я говорю «да» или «значит». И эти две команды обычно используются вместе.

Далее давайте посмотрим на конкретное использование команды test!

Язык кода:javascript
копировать
#!/bin/bash
read -p "please input file name: " filename
test -e $filename && echo "$filename exist" || echo "$filename no exist"

Результаты запуска:

Язык кода:javascript
копировать
please input file name: C-test
C-test exist

Это необходимо для проверки существования файла. Давайте посмотрим на оценку строки:

Язык кода:javascript
копировать
#!/bin/bash
echo "please input two string: "
read -p "first string: " first
read -p "second string: " second
test $first == $second && echo "equality" || echo "inequality"

Результаты запуска:

Язык кода:javascript
копировать
please input two string: 
first string: qwert
second string: qwert
equality

please input two string: 
first string: qwe
second string: asd
inequality

2.5. Определитель квадратных скобок [].

Символ решения [ ], как следует из названия, используется для оценки, но в него можно вводить только == или != Далее давайте посмотрим на конкретное использование:

Язык кода:javascript
копировать
#!/bin/bash
echo "please input two string: "
read -p "first string: " first
read -p "second string: " second
[ "$first" == "$second" ] && echo "equality" || echo "inequality"

Эта команда эквивалентна приведенной выше. Но будьте осторожны: переменная должна быть заключена в двойные кавычки.

2.6. Переменные по умолчанию.

Далее давайте представим переменные по умолчанию, а затем посмотрим на некоторые переменные по умолчанию:

  • 0 ~ n представляет параметры сценария оболочки, включая саму команду сценария оболочки, а сама команда сценария shlle имеет вид
  • $#: # представляет метку последнего параметра.
  • @:поверхность1、2、3…

Давайте посмотрим на конкретный код:

Язык кода:javascript
копировать
#!/bin/bash
echo "file name:" $0
echo "total parameter num: " $#
echo "all paramenters: " $@
echo "first paramenters: " $1
echo "second paramenters: " $2

Результаты запуска:

Язык кода:javascript
копировать
ygr@ygr-виртуальная-машина:~/Desktop$ ./my.sh qw er rt
file name: ./my.sh
total parameter num:  3
all paramenters:  qw er rt
first paramenters:  qw
second paramenters:  er

3. Оценка состояния сценария оболочки

if then

нашshellХотя сценарий может пройти&&и||для достижения простого Условное суждение,Но он не подходит для чуть более сложных сцен. Итак, сценарий оболочки дает нам, если Оператор условного определения, то записывается следующим образом. индивидуальное использование кода:

Язык кода:javascript
копировать
if Условное суждение ; then
//Что делать, когда решение вынесено
fi
Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 read -p "please input(Y/N): " value
  4  if [ "$value" == "Y" ] || [ "$value" == "y" ]; then
  5          echo "your input is Y !"
  6          exit 0
  7  fi
  8 
  9  if [ "$value" == "N" ] || [ "$value" == "n" ]; then
 10          echo "your input is N !"
 11          exit 0
 12  fi

Результаты бега следующие:

Язык кода:javascript
копировать
ygr@ygr-виртуальная-машина:~/Desktop$ ./my.sh
please input(Y/N): y
your input is Y !
ygr@ygr-виртуальная-машина:~/Desktop$ ./my.sh
please input(Y/N): n
your input is N !
if then else

В дополнение к if then у нас также есть операторы if then else, которые аналогичны if else в языке C. Конкретный метод записи следующий:

Язык кода:javascript
копировать
if Условное суждение ; then
//Условное Что нужно сделать при установлении суждения
else
//Условное суждение не установлено делать.
fi

или:

if Условное суждение ; then
//Условное Что нужно сделать при установлении суждения
elif [Условное суждение]; then
//Условное Что нужно сделать при установлении суждения
else
//Условное суждение не установлено делать.
fi

Давайте посмотрим на конкретный код:

Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 read -p "please input(Y/N): " value
  4  if [ "$value" == "Y" ] || [ "$value" == "y" ]; then
  5          echo "your input is Y !"
  6          exit 0
  7  else
  8          echo "your input is: $value !"
  9          exit 0
 10  fi

Результаты бега следующие:

Язык кода:javascript
копировать
please input(Y/N): t
your input is: t !

please input(Y/N): y
your input is Y !

Далее идет elif, давайте посмотрим на конкретный код использования:

Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 read -p "please input(Y/N): " value
  4 if [ "$value" == "Y" ] || [ "$value" == "y" ]; then
  5         echo "your input is Y !"
  6         exit 0
  7 elif [ "$value" == "N" ] || [ "$value" == "n" ]; then
  8         echo "your input is: $value !"
  9         exit 0
 10 else
 11         echo "your input is not recognized!"
 12 fi

Результаты запуска:

Язык кода:javascript
копировать
please input(Y/N): r
your input is not recognized!

please input(Y/N): y
your input is Y !

please input(Y/N): n
your input is: n !
case

Далее давайте представим оператор case, который аналогичен нашему случаю в языке C. Конкретный метод записи выглядит следующим образом:

Язык кода:javascript
копировать
case $переменная in

«Содержимое первой переменной»)
Раздел программы
;;   # Указывает конец этого программного блока! !

«Содержимое второй переменной»)
Раздел программы
;;

«Содержимое N-й переменной»)
Раздел программы
;;

esac

Далее давайте посмотрим на конкретную реализацию кода:

Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 case $1 in
  4         "chen")
  5                 echo "chen yi is my baby!"
  6                 ;;
  7         "ye")
  8                 echo "ye! happy every day!"
  9                 ;;
 10         *)
 11                 echo "your input is not recognized!"
 12                 ;;
 13 esac

Результаты бега следующие:

Язык кода:javascript
копировать
ygr@ygr-виртуальная-машина:~/Desktop$ ./my.sh ye
ye! happy every day!

ygr@ygr-виртуальная-машина:~/Desktop$ ./my.sh chen
chen yi is my baby!

ygr@ygr-виртуальная-машина:~/Desktop$ ./my.sh chr
your input is not recognized!

4. Функция сценария оболочки

без параметров

Скрипты оболочки также поддерживают функции. Функция без параметров записывается следующим образом:

Язык кода:javascript
копировать
function fname () {
    # Фрагмент функции
}

Конкретный код выглядит следующим образом:

Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 function help(){
  4     echo "this is help cmd!"
  5 }
  6 
  7 function close(){
  8     echo "this is close cmd!"
  9 }
 10 
 11 case $1 in
 12     "-h")
 13         help
 14         ;;
 15     "-c")
 16         close
 17         ;;
 18 esac

Результаты бега следующие:

Язык кода:javascript
копировать
ygr@ygr-виртуальная-машина:~/Desktop$ ./my.sh -h
this is help cmd!
ygr@ygr-виртуальная-машина:~/Desktop$ ./my.sh -c
this is close cmd!
С параметрами

Далее давайте представим функцию С параметрами. Конкретный метод записи следующий:

Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 print(){
  4     echo "parameter 1:$1!"
  5     echo "parameter 2:$2!"
  6 }
  7 
  8 print chen ye

Результаты бега следующие:

Язык кода:javascript
копировать
parameter 1:chen!
parameter 2:ye!

5. Петля ракушки

while

Сценарии оболочки также поддерживают циклы, например, while do Done, что означает, что если условие истинно, оно будет выполняться до тех пор, пока условие не станет истинным. Конкретный формат синтаксиса следующий:

Язык кода:javascript
копировать
while [состояние]  # Состояние в скобках — это выражение суждения.
do         # Цикл начинается
	# Сегмент цикла цикла
done

Конкретный код реализации выглядит следующим образом:

Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 while [ "$value" != "close" ]
  4 do
  5     read -p "please input str:" value
  6 done
  7 
  8 echo "stop while!!!"

Результаты бега следующие:

Язык кода:javascript
копировать
please input str:er
please input str:stop
please input str:close
stop while!!!
until

Существует еще один метод до выполнения, который означает, что он зацикливается, когда условие не установлено, и не зацикливается после того, как условие установлено. Конкретный формат синтаксиса следующий:

Язык кода:javascript
копировать
until [состояние]
do
//Сегмент цикла цикла
done

Конкретный код реализации выглядит следующим образом:

Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 until [ "$value" == "close" ]
  4 do
  5     read -p "please input str:" value
  6 done
  7 
  8 echo "stop while!!!"

Результаты бега следующие:

Язык кода:javascript
копировать
please input str:co
please input str:close
stop while!!!
for

Цикл for в сценарии оболочки очень похож на цикл for в Python. Фактически, поскольку Python на самом деле является языком сценариев, вы можете узнать количество циклов, используя цикл for. Конкретный формат синтаксиса следующий:

Язык кода:javascript
копировать
for var in con1 con2 con3……
do
# Сегмент цикла цикла
done

#для цикла числовой обработки, метод записи 

for((начальное значение; предельное значение; Размер шага выполнения))
do
# Сегмент цикла цикла
done

Конкретная реализация синтаксиса следующая:

Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 for name in ygr cy
  4 do
  5     echo "your name is :$name!"
  6 done

Результаты бега следующие:

Язык кода:javascript
копировать
your name is :ygr!
your name is :cy!

Далее мы рассмотрим еще один цикл for:

Язык кода:javascript
копировать
  1 #!/bin/bash
  2 
  3 read -p "please input count: " count
  4 
  5 total=0
  6 for((i=0; i<=count; i=i+1))
  7 do
  8     total=$(($total+$i))
  9 done
 10 
 11 echo «Сумма первых n целых чисел равна: $total"

Результаты бега следующие:

Язык кода:javascript
копировать
please input count: 5
Сумма первых n целых чисел равна: 15
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose