美文网首页
Shell入门

Shell入门

作者: 我阿郑 | 来源:发表于2022-01-09 10:54 被阅读0次

一、 Shell是什么?

计算机只能识别0和1组成的二进制机器码,并利用这些机器码来完成各种操作。但是用户输入计算机的并不是二进制的机器码,而是一些字母、数字和其他字符组成的命令。那么这就需要一个可以将这些非0和1的指令翻译成计算可以识别的二进制机器码,在Linux系统中这个翻译器就是Shell

Shell 是一个用 C 语言编写的程序, 它是用户和Linux内核沟通的桥梁 。
在Linux/UNIX操作系统中存在多种类型的Shell,常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
image.png

从上图可以看出Shell在操作系统中起到了承接用户和系统内核的作用。

为什么需要Shell?

Q:那为什么不直接让用户层直接处理内核层 ??
原因很简单,因为内核层处理的是二进制,而用户层处理的都是高级语言。

举个例子:
你想和妹子表白:我爱你
如果没有shell的情况下,需要经过以下步骤:

  • 你在计算机输入“我爱你” 翻译成二进制 0 和 1, 然后传给内核
  • 内核通过网卡将0和1发送给妹子的计算机
  • 妹子计算机网卡收到你发送的二进制交给内核
  • 妹子看到一堆二进制,一脸懵逼,二进制不是人人都能看懂的

为了让所有人都能快速、方便的使用计算机,系统开发人员通过shell解决了这个问题,使任何一个希望通过计算机来工作、娱乐的人都能够快速操作计算机。

二、Shell 模式类别

Shell的模式可分为:

  • 交互模式 : 处于交互模式下的Shell,通常在用户终端读取输入
  • 非交互模式:处于非交互模式下的Shell,则可自动完成读取而不需要用户输入
#!/bin/sh,它同样也可以改为 #!/bin/bash
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序

三、Shell语法

🔴 Shell脚本就是将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。

1-脚本的执行环境

脚本运行环境以 #!这个特殊符号组合来组成,如#!/bin/bash#!/usr/bin/bash 指定该脚本运行解析由/bin/bash来完成的;

在编写一个脚本的开头,都必须指定脚本的执行环境在脚本开端最好描述清楚作者、时间

#! /bin/bash
#Author:JiaJung
#Created Date :2021/12/12
#Release:1.0
  • 在shell脚本中 #号代表注释,但#!是个特例

2-Linux下支持多种shell

image.png

3- 运行shell脚本

  • 给执行权限

脚本运行需要执行权限,当我们给一个文件赋予执行权限后,该脚本就可以执行

chmod u+x filename
# 比如
chmod 644 test.sh
  • 解释器直接运行不需要给权限

如果不希望赋予脚本执行权限。那么可以使用bash命令来运行未给予执行权限的脚本

bash filename
# 比如
bash test.sh

4-shell中的特殊符号

image.png

单引号不解释变量

image.png

shell基本输入

1- read命令

默认接受键盘的输入,回车符代表输入结束
read 命令选项

-p 打印信息
-t 限定时间
-s 不回显
-n 输入字符个数

举个例子🌰

echo -n -e "Login: "
#定义一个变量 存储键盘的输入
read acc 
echo -n -e "Password: "
#read pw
# -s不显示密码  -t5表示5秒钟不输入就退出了   -n6 密码只支持6位数
read -s -t5 -n6 pw 

echo "account: $acc  password: $pw "

### 例子
echo "Centos Linux 7:(Core) "
echo -e "kernel `uname -r` an `uname -m`\n "

echo -n -e "$HOSTNAME login: "
read acc 
read -s -p "Password: "
read pw

Shell 变量

1G内存有多少个1B的单位呐??

1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB

  1. Linux shell中的变量分为:系统变量和用户自定义变量
  2. 系统变:$HOME、$PWD$SHELL、$USER、$PATH 等等, 比如 echo $HOMEecho $PATH
  3. 显示当前shell中所有变量: set
  4. 定义变量: 变量=值
  5. 撤销变量:unset 变量
  6. 声明静态变量:readonly 变量, 注意不能unset
  7. 变量名习惯大写
1-变量分类
    1. 用户私有变量:只有本用户可使用,保存在home目录下的 .bash_profile、.bashrc 文件中 (.bash_profile、内部会加载 .bashrc
    1. 全局变量:所有用户都可以使用,保存在/etc/profile、/etc/bashrc文件中
    1. 用户自定义变量:用户自定义,比如脚本中的变量
2-定义变量
  • 在shell编程中的变量名和等号之间不能有空格
  • 不能以数字开头,不能使用标点符号、可使用下划线
  • 不能使用bash里的关键字(可用help命令查看保留关键字)
3-使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

如果不给skill变量加花括号,写成 echo "I am good at $skillScript" ,解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。推荐给所有变量加上花括号,这是个好的编程习惯。

4-设置环境变量
基本语法
export  变量名=变量值 # 将shell变量输出为环境变量/ 全局变量
source 配置文件 # 让修改后的配置信息立即生效
echo $变量名 # 查询环境变量的值

举例子:

- 在/etc/profile 文件中定义TOMCAT_HOME 环境变量
- 查看环境变量TOMCAT_HOME的值
- 在另外一个shell程序中使用TOMCAT_HOME

vim  /etc/profile # 打开文件
export TOMCAT_HOME=/opt/tomcat # 定义环境变量 /opt/tomcat 就是tomcat这个可执行文件所在的路径
source /etc/profile # 让修改立即生效
echo $TOMCAT_HOME

转义字符

字符 说明
\a 发成警告声
\b 删除前一个字符
\c 最后不加上换行符号
\f 换页,将当前位置移到下页开头
\n 换行
\r 回车
\t 水平制表符(tab键)
\v 垂直制表符
\\ 反斜杠
echo -e "\t\t\t\tFruits Shop"
echo -e "\t1) Apple"
echo -e "\t2) Orange"
echo -e "\t3) Banana"

颜色代码

脚本中echo显示内容,显示带颜色的内容,需要使用参数 -e ,格式如下:

echo -e “\033[字背景颜色:文字颜色m字符串\033[0m”

更多颜色代码百度

shell流程控制-if判断

  if test  (表达式为真)

  if test !表达式为假

  test 表达式1 –a 表达式2                  两个表达式都为真

  test 表达式1 –o 表达式2                 两个表达式有一个为真
1. 数学比较运算

运算符解释

  • -eq 等于
  • -lt 小于
  • -gt 大于
  • -ge 大于或等于
  • -le 小于或等于
  • -ne 不等于
  test 整数1 –eq 整数2                        整数相等

  test 整数1 –ge 整数2                        整数1大于等于整数2

  test 整数1 –gt 整数2                         整数1大于整数2

  test 整数1 –le 整数2                         整数1小于等于整数2

  test 整数1 –lt 整数2                          整数1小于整数2

  test 整数1 –ne 整数2                        整数1不等于整数2
2. 字符串比较运算

注意字符串别忘了使用单引号引起来

  • == 等于
  • != 不等于
  • -n 检查字符串的长度是否大于0
  • -z 检查字符串的长度是否为0
  test –n 字符串                                   字符串的长度非零

  test –z 字符串                                    字符串的长度为零

  test 字符串1=字符串2                    字符串相等

  test 字符串1!=字符串2               字符串不等
3. 文件比较与检查
      test  File1 –ef  File2                            两个文件具有同样的设备号和i结点号

  test  File1 –nt  File2                            文件1比文件2 新

  test  File1 –ot  File2                            文件1比文件2 旧

  test –b File                                           文件存在并且是块设备文件

  test –c File                                           文件存在并且是字符设备文件

  test –d File                                           文件存在并且是目录

  test –e File                                           文件存在

  test –f File                                            文件存在并且是正规文件

  test –g File                                           文件存在并且是设置了组ID

  test –G File                                           文件存在并且属于有效组ID

  test –h File                                           文件存在并且是一个符号链接(同-L)

  test –k File                                           文件存在并且设置了sticky位

  test –b File                                           文件存在并且是块设备文件

  test –L File                                           文件存在并且是一个符号链接(同-h)

  test –o File                                           文件存在并且属于有效用户ID

  test –p File                                           文件存在并且是一个命名管道

  test –r File                                            文件存在并且可读

  test –s File                                           文件存在并且是一个套接字

  test –t FD                                             文件描述符是在一个终端打开的

  test –u File                                           文件存在并且设置了它的set-user-id位

  test –w File                                          文件存在并且可写

  test –x File                                           文件存在并且可执行
4. 逻辑运算

逻辑运算 与 &&
逻辑运算 或 ||
逻辑运算 非 !

if语法

1. 单if语句

适用范围:只需要一步判断
语法格式:

if [condition]   # condition值为true or false
    then
        commands
fi

### 举个例子
if [ ! -d "$sdk_mid_build_framework_merge_path_dir" ] then
mkdir $sdk_mid_build_framework_merge_path_dir
fi
2. if-then-else 语句

适用范围:两步判断

if [condition]   # condition值为true or false
    then
        commands1
else
        commands2
fi
3. 多步if
image.png

for循环

语法一

for var in value1 value2…
    do
        commands
done

举例子

#!/bin/bash
for time in `seq 9 -1  0`;do
    echo $time
done

# 倒计时
for time in `seq 9 -1  0`;do
    echo -n -e "\b$time"
    sleep 1
done

语法二 (c式的for命令)

for (( 变量;条件;自增减运算))
    do
        代码块
done

# Example
for (( i=1;i<10;i++))
    do
       echo $i
done

for循环使用多个变量

for (( a=0,b=9;a<10;a++,b--))
    do
       echo $a $b
done

执行结果

0    9
1    8
2    7
3    6
…….

continue 和break

和其他语言用法一样

数组

1-基本数组

数组可以让就一次赋予多个值,需要读取数据时只需通过索引调用就可以方便读出了
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

array_name=(value1 value2 ... valuen)
# 举例子
array_name=(A B "C" D)

# 也可以使用下标来定义数组
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

#读取数组一般格式:
${array_name[index]}
# 举例子
echo "第一个元素为: ${array_name[0]}"
echo "第二个元素为: ${array_name[1]}"
echo "第三个元素为: ${array_name[2]}"

2-关联数组

# 首先需要用单独的语句将变量声明为关联数组
declare -A arr_array
# 定义数组 索引为apple orange
arr_array=([apple]='100' [orange]='200') 
# 数组指定索引的数组的值
echo ${arr_array[apple]}    # 100

3- 获取数组的索引列表

echo ${!arr_array[*]} # 打印orange apple

访问数组元素

获取数组中的所有元素
使用@ 或 * 可以获取数组中的所有元素,例如:

echo "数组的元素为: ${arr_array[*]}"
echo "数组的元素为: ${arr_array[@]}"

获取数组的长度

echo "数组元素个数为: ${#arr_array[*]}"
echo "数组元素个数为: ${#arr_array[@]}"
image.png image.png

遍历数组

遍历(For循环法):

for var in ${ arr_array[@] };
do
    echo $var
done

遍历(带数组下标):

for i in "${!arr_array[@]}"; do 
    printf "%s\t%s\n" "$i" "${arr_array[$i]}"
done

遍历(While循环法):

i=0
while [ $i -lt ${ #arr_array[@] } ]
do
    echo ${ arr_array[$i] }
    let i++
done

函数

1- 函数语法

函数名() { ### 语法一:
    代码块
    return N
}
或
function 函数名 { ### 语法二:
    代码块
    return N
}
# 例子
start(){
    echo “start…”
    Return 0
}
#函数调用
start

Shell其他常用命令

删除

删除用 rm -rf xxx

退出

exit返回退出

清屏命令

clear清屏

查看更全的命令

man test 查看更全的命令

格式化输出

一个程序需要有0个或以上输入,一个或更多输出

echo 命令介绍

echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
语法:echo [-ne][字符串]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。

命令选项:

  • -n不要在最后自动换行
  • -e若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出;

相关文章

网友评论

      本文标题:Shell入门

      本文链接:https://www.haomeiwen.com/subject/gvzjcrtx.html