Основы оболочки для грамотности на 3000 слов

Linux

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

Переменные основного синтаксиса оболочки

именование переменных оболочки
变量只能由大小写字母,数字和下划线组成。
变量名称不能以数字开头。
变量可以存储数字类型或者字符串类型。
变量赋值等号两边不能有空格。
 字符串的变量可以用单引号或者双引号括起来。

Определите переменные:

➜  ~ name="xiaoka"
➜  ~ age=2

неверное определение

[root@iz2ze0ajic0vbv28hcdctpz hello]# 1212=sfds
-bash: 1212=sfds: 未找到命令
[root@iz2ze0ajic0vbv28hcdctpz hello]# ?aasd=hehe
-bash: ?aasd=hehe: 未找到命令
вызов переменной оболочки

Переменные вызываются с помощью знака $ или знака $, за которым следуют фигурные скобки. В общем, используйте фигурные скобки. Например:

[root@iz2ze0ajic0vbv28hcdctpz hello]# apple=hongfushi
[root@iz2ze0ajic0vbv28hcdctpz hello]# echo $applepen

[root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${apple}pen
hongfushipen

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

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

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

[root@iz2ze0ajic0vbv28hcdctpz hello]# database=mysql

[root@iz2ze0ajic0vbv28hcdctpz hello]# echo $database
mysql
[root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${database}
mysql

переменная окружения: Просмотрите глобальные переменные среды:

[root@iz2ze0ajic0vbv28hcdctpz ~]# printenv
XDG_SESSION_ID=2044
HOSTNAME=iz2ze0ajic0vbv28hcdctpz
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=113.44.42.209 56074 22
SSH_TTY=/dev/pts/1
USER=root
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
MAVEN_HOME=/usr/local/apache-maven-3.6.0
MAIL=/var/spool/mail/root
PATH=/usr/local/apache-maven-3.6.0/bin:/usr/local/jdk1.8.0_191/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
JAVA_HOME=/usr/local/jdk1.8.0_191
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
CLASSPATH=.:/lib/dt.jar:/lib/tools.jar
SSH_CONNECTION=113.44.42.209 56074 172.17.187.244 22
LC_CTYPE=zh_CN.UTF-8
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/printenv

определить переменную среды

[root@iz2ze0ajic0vbv28hcdctpz ~]# export kaka="kaka"
[root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka
kaka=kaka

удалить переменную окружения

[root@iz2ze0ajic0vbv28hcdctpz ~]# unset kaka
[root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka

w Если вы используете его в течение длительного времени, вы можете написать их в файле конфигурации. /etc/profile или .bash_profile в домашнем каталоге пользователя

переменная положения: Давайте сначала определим оболочку.

[root@iz2ze0ajic0vbv28hcdctpz ~]# cat test.sh
#!/bin/bash

echo "执行的文件: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"

Выполните, чтобы просмотреть результаты.

[root@iz2ze0ajic0vbv28hcdctpz ~]# chmod +x test.sh
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2
执行的文件: ./test.sh
第一个参数: 1
第二个参数: 2

Предопределенные переменные: Обычно используются следующие предопределенные переменные.

#!/bin/bash

echo "执行的文件: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "所有参数: $*"
echo "当前脚本的pid: $"
echo "脚本参数个数: $#"

Посмотреть результаты выполнения

[root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2
执行的文件: ./test.sh
第一个参数: 1
第二个参数: 2
所有参数: 1 2
当前脚本的pid: 30170
脚本参数个数: 2

Просмотрите результат выполнения предыдущей команды.

[root@iz2ze0ajic0vbv28hcdctpz hello]# ls
test
[root@iz2ze0ajic0vbv28hcdctpz hello]# echo $?
0

оператор оболочки

Оболочка — это тоже язык, по сути, она похожа на другие операторы языка, но здесь мы поговорим о ней. В этом разделе рассказывается о контенте, связанном с операторами.

тип оператора
  • арифметические операторы
  • оператор отношения
  • логический оператор
  • Логические операторы
  • строковый оператор
  • оператор проверки файлов
арифметические операторы

Команда: выражение

Цель: Оценить значение выражения

Синтаксис: expr выражение

правило:

  • ​ С обеих сторон символа оператора должны быть пробелы

  • При встрече со специальными символами, такими как *, вам нужно добавить обратную косую черту перед

  • Пробелы и специальные строки необходимо заключать в кавычки

    Операция: (сначала напишите сценарий оболочки, связанный с операцией)

#!/bin/bash
i=1
j=2
addition=`expr $i + $j`
subtraction=`expr $i - $j`
multiplication=`expr $j \* $j`
division=`expr $j / $i`
mod=`expr $j % $i`
echo "addition=${addition} , subtraction=${subtraction} , multiplication=${multiplication} , division=${division} , mod=${mod}"

if [ $i == $j ]
then
   echo "i 等于 j"
fi

if [ $i != $j ]
then
   echo "i 不等于 j"
fi

Посмотреть Результаты:

➜  ~ ./operation.sh
addition=3 , subtraction=-1 , multiplication=4 , division=2 , mod=0
i 不等于 j

оператор отношения

Действие: (написать сценарий)

#!/bin/bash
num1=5
num2=8
if [ $num1 -eq $num2 ]
then
  echo "$num1 是否等于 $num2 : num1 等于 num2"
else
  echo "$num1 是否等于 $num2: num1 不等于 num2"
fi
if [ $num1 -ne $num2 ]
then
  echo "$num1 是否不等于 $num2: num1 不等于 num2"
else
  echo "$num1 是否不等于 $num2 : num1 等于 num2"
fi
if [ $num1 -gt $num2 ]
then
  echo "$num1 是否大于 $num2: num1 大于 num2"
else
  echo "$num1 是否大于 $num2: num1 不大于 num2"
fi
if [ $num1 -lt $num2 ]
then
  echo "$num1 是否小于 $num2: num1 小于 num2"
else
  echo "$num1 是否小于 $num2: num1 不小于 num2"
fi
if [ $num1 -ge $num2 ]
then
  echo "$num1 是否大于等于 $num2: num1 大于或等于 num2"
else
  echo "$num1 是否大于等于 $num2: num1 小于 num2"
fi
if [ $num1 -le $num2 ]
then
  echo "$num1 是否小于等于 $num2: num1 小于或等于 num2"
else
  echo "$num1 是否小于等于 $num2: num1 大于 num2"
fi

Результат операции:

➜  ~ ./relation.sh
5 是否等于 8: num1 不等于 num2
5 是否不等于 8: num1 不等于 num2
5 是否大于 8: num1 不大于 num2
5 是否小于 8: num1 小于 num2
5 是否大于等于 8: num1 小于 num2
5 是否小于等于 8: num1 小于或等于 num2
логический оператор

Напишите скрипт:

#!/bin/bash
num1=3
num2=23
if [ $num1 != $num2 ]
then
  echo "$num1 != $num2 : num1 不等于 num2"
else
  echo "$num1 != $num2: num1 等于 num2"
fi
if [ $num1 -lt 25 -a $num2 -gt 15 ]
then
  echo "$num1 小于 25 且 $num2 大于 15 : 返回 true"
else
  echo "$num1 小于 25 且 $num2 大于 15 : 返回 false"
fi
if [ $num1 -lt 25 -o $num2 -gt 25 ]
then
  echo "$num1 小于 25 或 $num2 大于 25 : 返回 true"
else
  echo "$num1 小于 25 或 $num2 大于 25 : 返回 false"
fi

Посмотреть Результаты:

➜  ~ ./bool.sh
3 != 23 : num1 不等于 num2
3 小于 25 且 23 大于 15 : 返回 true
3 小于 25 或 23 大于 25 : 返回 true
строковый оператор

Напишите скрипт:

#!/bin/bash
apple="apple"
pen="pen"

if [ $apple = $pen ]
then
  echo "$apple = $pen : apple 等于 pen"
else
  echo "$apple = $pen: apple 不等于 pen"
fi
if [ $apple != $pen ]
then
  echo "$apple != $pen : apple 不等于 pen"
else
  echo "$apple != $pen: apple 等于 pen"
fi
if [ -z $apple ]
then
  echo "-z $apple : 字符串长度为 0"
else
  echo "-z $apple : 字符串长度不为 0"
fi
if [ -n "$apple" ]
then
  echo "-n $apple : 字符串长度不为 0"
else
  echo "-n $apple : 字符串长度为 0"
fi
if [ $apple ]
then
  echo "$apple : 字符串不为空"
else
  echo "$apple : 字符串为空"
fi

Результаты:

[root@iz2ze0ajic0vbv28hcdctpz ~]# ./string.sh
apple = pen: apple 不等于 pen
apple != pen : apple 不等于 pen
-z apple : 字符串长度不为 0
-n apple : 字符串长度不为 0
apple : 字符串不为空
Логические операторы

Напишите скрипт:

#!/bin/bash
num1=5
num2=8
if [[ $num1 -lt 10 && $num2 -gt 5 ]]
then
  echo "返回 true"
else
  echo "返回 false"
fi

if [[ $num1 -lt 10 || $num2 -gt 5 ]]
then
  echo "返回 true"
else
  echo "返回 false"
fi

Результаты:

[root@iz2ze0ajic0vbv28hcdctpz ~]# ./logic.sh
返回 true
返回 true
оператор проверки файлов

Напишите скрипт:

~ cat testfile.sh
#!/bin/bash

file="/root/testfile.sh"

if [ -r $file ]
then
   echo "该文件可读"
else
   echo "该文件不可读"
fi
if [ -x $file ]
then
   echo "该文件可执行"
else
   echo "该文件不可执行"
fi
if [ -w $file ]
then
   echo "该文件可写"
else
   echo "该文件不可写"
fi

if [ -f $file ]
then
   echo "该文件是普通文件"
else
   echo "该文件是非普通文件"
fi

if [ -s $file ]
then
   echo "该文件为空"
else
   echo "该文件不为空"
fi
if [ -d $file ]
then
   echo "该文件是目录"
else
   echo "该文件不是目录"
fi

Выполните скрипт:

➜  ~ ./testfile.sh
该文件可读
该文件可执行
该文件可写
该文件是普通文件
该文件为空
该文件不是目录

Оценка состояния оболочки и управление технологическим процессом

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

одна ветвь, если

Блок-схема:

Пример:

➜  if cat if-one.sh
#!/bin/bash
a=10

if [ a > 5 ]
then
 echo "a 大于 5"
fi

Результаты:

➜  if ./if-one.sh
a 大于 5
двойная ветвь, если

Блок-схема:

Пример:

➜  if cat if-double.sh
#!/bin/bash
age=18
if [ $age -ge 18 ]; then
  echo "成年"
else
  echo "未成年"
fi

Результаты:

➜  if ./if-double.sh
成年
многоветвевой оператор if

Блок-схема:

Пример:

➜  if cat if-multi.sh
#!/bin/bash
money=10
if [ $money -lt 1 ]
then
  echo "1块钱都没有的比皮卡丘决定在家吃土"
elif [ $money -ge 1 -a $money -lt 5 ]
then
  echo "老板我要大白兔奶糖"
elif [ $money -ge 5 -a $money -le 10 ]
then
  echo "老板我要巧克力"
else
  echo "老板给我拿个鸡腿"
fi

Результаты:

➜  if ./if-multi.sh
老板我要巧克力

Эта статья обновила некоторые базовые знания оболочки. Если вы хотите изучить ее, не копируйте ее, а напечатайте вручную. Постоянно обновляется. . . ⛽️

В этой статье используетсяmdniceнабор текста

Категории