Shell是什么

  1. Shell是一种易编写、易调试的解释型编程语言。<br /> Shell文件需要使用shell解释器进行解析,Shell解释器能够接收应用程序或者用户的命令,然后调用系统内核。
  • 通过cat /etc/shells可以查询Linux系统中有那些Shell解释器。
  • 通过echo $SHELL可以查询系统默认的解释器。

    Shell脚本入门

  • Shell文件必须以#!/bin/bash开头,用于指定脚本需要使用的解释器。

  • shell文件可以通过sh 文件名执行,也可以通过chmod a+x 文件名给文件添加执行权限,然后执行执行文件。

    示例:打印hello world

    创建文件helloWorld.sh
    1. vi helloWorld.sh
    文件内容如下: ```shell

    !/bin/bash

echo “Hello World”

  1. 通过`sh helloWorld.sh`可以执行脚本。
  2. > 注意:如果通过以下命令给`helloWorld.sh`添加权限,可以通过`./helloWorld.sh`执行文件。
  3. ```shell
  4. # 给文件添加执行权限
  5. chmod a+x helloWorld.sh

示例:指定目录下创建文件

创建文件createFile.sh

  1. vi createFile.sh

文件内容如下:

  1. #!/bin/bash
  2. # 创建路径
  3. mkdir test
  4. # 进入test路径
  5. cd test
  6. # 创建HelloWorld.txt文件
  7. touch HelloWorld.txt
  8. # 添加内容到文件
  9. echo "Hello World" >> HelloWorld.txt

通过sh helloWorld.sh可以执行脚本。

Shell中的变量

Shell中的变量分以下几种:

  • 系统变量:操作系统已经定义的变量,我们可以直接使用
  • 自定义变量:我们自己定义的变量,可以在我们的脚本文件中使用
  • Shell特殊变量:Shell提供了一些特殊的变量,可以方便我们在Shell脚本中使用。

    系统变量

    常见的系统变量有:

  • $HOME:当前用户的Home路径

  • $PWD:当前的工作目录
  • $SHELL:默认的Shell解析器
  • $USER:当前用户

示例:

  1. #!/bin/bash
  2. # 输出当前系统默认的Shell解析器
  3. echo $SHELL
  4. # 输出当前用户的Home路径
  5. echo $HOME
  6. # 输出当前用户
  7. echo $USER
  8. # 输出当前的工作目录
  9. echo $PWD

执行脚本后得到如下结果:

  1. /bin/bash
  2. /home/chentiefeng
  3. chentiefeng
  4. /home/chentiefeng/shell-demo/hello-world

自定义变量

  • 定义变量:变量名=值
  • 撤销变量:unset 变量名
  • 声明静态变量:readonly 变量名,注意:readonly定义的变量不支持unset。
  • 声明全局变量:export 变量名,全局变量可以供其他Shell程序使用

    注意:

    • 变量名可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
    • 变量赋值的=两边不能有空格。
    • 变量默认都是字符串类型,无法直接用于数值运算。
    • 变量的值如果有空格,需要使用双引号或者单引号括起来。

Shell特殊变量

  • $n:n为数字
    • $0:代表正在执行的文件名
    • $1-$9:代表第一到第九个参数
    • ${10}:10以及10以上的参数,需要使用大括号包含,如${10}代表第10个参数
  • $#:获取所有输入参数的个数
  • $*:代表所有的参数,$*把所有参数作为一个整体
  • $@:也代表所有参数,$@把每个参数区分对待
  • $?:返回上一次执行的命令的返回状态
    • 如果值为0,表明上一个命令正确执行
    • 如果值不为0,表明上一个命令执行不正确
  • $_:保存之前执行的命令的最后一个参数
  • $!:后台运行的最后一个进程的ID号
  • $$:脚本运行的当前进程ID号

    运算符

    基本语法:

  • $((运算式))或者$[运算式]

  • expr +,-,\*,/,%:加,减,乘,除,取余

示例:(2+3)x 4

  1. expr `expr 2 + 3` \* 4

或者:

  1. tmp=$[(2+3)*4]
  2. echo $tmp

条件判断

基本语法:

  1. [ condition ]

注意:条件condition非空即为true,即[]为false

两个整数判断

  • =:字符串比较
  • -lt:小于(less than)
  • -le:小于等于(less equal)
  • -eq:等于(equal)
  • -gt:大于(greater than)
  • -ge:大于等于(greater equal)
  • -ne:不等于(not equal)

示例:

  1. [ 1 -eq 2 ]
  2. echo $? #1
  3. [ 1 -le 2 ]
  4. echo $? #0

文件权限判断

  • -r:读的权限(read)
  • -w:写的权限(write)
  • -x:执行的权限(execute)

示例:

  1. touch test.txt
  2. [ -x test.txt ]
  3. echo $? #1

文件类型判断

  • -e:文件存在(existence)
  • -f:文件存在并且是一个常规的文件(file)
  • -d:文件存在并且是一个文件夹(directory)

示例:

  1. touch test.txt
  2. [ -e test.sh ]
  3. echo $? #1
  4. [ -e test.txt ]
  5. echo $? #0

多条件判断

  • &&:前一条执行成功,才执行后一条
  • ||:前一条执行失败,才执行后一条

示例:

  1. touch test.txt
  2. [ -e test.txt ] || [ -e test.sh ]
  3. echo $? #0
  4. [ -e test.txt ] && [ -e test.sh ]
  5. echo $? #1

流程控制

if 判断

基本语法:

  1. if [ condition ];then
  2. # 逻辑
  3. fi

或者:

  1. if [ condition ]
  2. then
  3. # 逻辑
  4. fi

示例:

  1. #!/bin/bash
  2. if [ -f $1 ];then
  3. echo '第一个参数是一个可执行文件'
  4. elif [ -d $1 ];then
  5. echo '第一个参数是一个文件夹'
  6. fi

case语句

基本语法:

  1. case $变量名 in
  2. "值1")
  3. //执行逻辑1
  4. ;;
  5. "值2")
  6. //执行逻辑2
  7. ;;
  8. *)
  9. //默认执行逻辑
  10. ;;
  11. esac

示例:

  1. #!/bin/bash
  2. case $1 in
  3. 1)
  4. echo "[1]input value is 1"
  5. ;;
  6. 2)
  7. echo "[2]input value is 2"
  8. ;;
  9. *)
  10. echo "[*] input value is $1"
  11. ;;
  12. esac

for循环

基本语法1

  1. for((初始值;循环控制条件;变量变化))
  2. do
  3. //执行逻辑
  4. done

示例:

  1. #!/bin/bash
  2. sum=0
  3. for((i=1;i<=100;i++))
  4. do
  5. sum=$[$sum+$i]
  6. done
  7. echo $sum

基本语法2

  1. for 变量 in 1 2
  2. do
  3. //执行逻辑
  4. done

示例:打印所有输入的参数

  1. #!/bin/bash
  2. for i in $*
  3. do
  4. echo $i
  5. done

while循环

基本语法:

  1. while [ 条件判断式 ]
  2. do
  3. // 执行逻辑
  4. done

示例:

  1. #!/bin/bash
  2. sum=0
  3. i=1
  4. while [ $i -le 100 ]
  5. do
  6. sum=$[$sum+$i]
  7. i=$[$i+1]
  8. done
  9. echo $sum

read读取控制台输入

基本语法:

  1. read(选项)(参数)

选项:

  • -p:指定读取值时的提示符
  • -t:指定读取值时等待的时间(秒)

参数:

  • 变量:指定读取值的变量名

示例;在10秒内输入用户名

  1. #/bin/bash
  2. read -t 10 -p "Please input your username: " username
  3. echo $username

注意:如果10秒内没有输入,到时间程序会自动退出

函数

系统函数

basename

描述:basename会删除所有的前缀包括最后一个(/)字符,然后将字符串显示出来。
基本语法:

  1. basename [string/pathname][suffix]

选项:

  • suffix为后缀,如果指定了suffix,basename会将pathname或string中的suffix去掉

示例:取出文件名

  1. $ basename $pwd/009read.sh
  2. 009read.sh

自定义函数