极简Shell编程入门

文章目录

      • 1. Shell 概述
      • 2. Shell 脚本入门
      • 3. Shell 中的变量
        • 1. 系统变量
        • 2. 自定义变量
        • 3. 特殊变量
          • 1. $n
          • 2. $#
          • 3. \$*、\$@
          • 4. $?
      • 4. 运算符
      • 5. 条件判断
      • 6. 流程控制
        • 1. if
        • 2. case
        • 3. for
        • 4. while

1. Shell 概述

  • Shell 是一个命令行解释器,接收应用程序/用户命令,调用操作系统内核
  • Shell 也是一种编程语言,易编写、易调试、灵活性强

2. Shell 脚本入门

  1. 脚本格式

    脚本以 #!/bin/bash开头(指定 Shell 的解析器)

  2. helloworld

    需求:创建 Shell 脚本,输出 helloworld

    1. 编写脚本

      root@iZwz9guplfkml2vvggil90Z:~# vi helloworld.sh
      
      #!/bin/bash
      echo "helloworld"
      
    2. 执行脚本

      1. 使用 bash 命令

        root@iZwz9guplfkml2vvggil90Z:~# bash helloworld.sh 
        helloworld
        
      2. 直接执行

        # 赋予脚本可执行权限
        root@iZwz9guplfkml2vvggil90Z:~# chmod 777 helloworld.sh 
        # 执行脚本
        root@iZwz9guplfkml2vvggil90Z:~# ./helloworld.sh 
        helloworld
        
  3. 多命令处理

    需求:在 /root 目录下创建 ddd 文件,在 ddd 文件中增加 “I’m ddd”

    root@iZwz9guplfkml2vvggil90Z:~# vi ddd.sh
    
    #!/bin/bash
    cd /root
    touch ddd
    echo "I'm ddd" >> ddd
    

3. Shell 中的变量

1. 系统变量

# $HOME,输出家目录
root@iZwz9guplfkml2vvggil90Z:~# echo $HOME
/root
# $PWD,输出当前路径
root@iZwz9guplfkml2vvggil90Z:/opt# echo $PWD
/opt
# $SHELL,输出当前Shell解析器所在位置
root@iZwz9guplfkml2vvggil90Z:~# echo $SHELL
/bin/bash
# $USER,输出当前用户名
root@iZwz9guplfkml2vvggil90Z:~# echo $USER
root

2. 自定义变量

  1. 基本语法

    #定义变量:变量=值
    root@iZwz9guplfkml2vvggil90Z:~# c=2
    #撤销变量:unset 变量
    root@iZwz9guplfkml2vvggil90Z:~# unset c
    #声明静态变量:readonly 变量,注意静态变量不能被 unset
    root@iZwz9guplfkml2vvggil90Z:~# readonly w=2
    #使用变量:$变量名字
    root@iZwz9guplfkml2vvggil90Z:~# echo $w
    2
    
  2. 变量定义规则

    • 变量名可以由字母、数字和下划线组成,但是不能以数字开头,环境变量建议大写

    • 等号两侧不能有空格

      root@iZwz9guplfkml2vvggil90Z:~# c = 2
      c: command not found
      root@iZwz9guplfkml2vvggil90Z:~# c= 2
      2: command not found
      root@iZwz9guplfkml2vvggil90Z:~# c =2
      c: command not found
      
    • 变量默认为字符串类型,无法直接进行数值计算

      root@iZwz9guplfkml2vvggil90Z:~# h=1+2
      root@iZwz9guplfkml2vvggil90Z:~# echo $h
      1+2
      
    • 变量的值如果有空格,需要使用双引号或单引号括起来

      root@iZwz9guplfkml2vvggil90Z:~# h=h h h
      h: command not found
      root@iZwz9guplfkml2vvggil90Z:~# h="h h h"
      root@iZwz9guplfkml2vvggil90Z:~# echo $h
      h h h
      

3. 特殊变量

1. $n

$n,n为数字,$0代表该脚本名称,$1~$9代表第一到第九个参数,十以上的参数需要大括号括起来,如${10}

root@iZwz9guplfkml2vvggil90Z:~# vi para.sh

#!/bin/bash
  
echo "$0 $1 $2"

root@iZwz9guplfkml2vvggil90Z:~# bash para.sh p1 p2
para.sh p1 p2
2. $#

$#,获取所有输入参数个数

root@iZwz9guplfkml2vvggil90Z:~# vi para.sh 

#!/bin/bash
echo $#
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1
1
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1 s2 s3
3
3. $*、$@
  • $*:代表命令行中所有的参数,把所有参数看成一个整体
  • $@:代表命令行中所有的参数,但是把每个参数区分看待
root@iZwz9guplfkml2vvggil90Z:~# vi para.sh 

#!/bin/bash
echo $*
echo $@
root@iZwz9guplfkml2vvggil90Z:~# bash para.sh s1 s2 s3
s1 s2 s3
s1 s2 s3
4. $?

$?,返回上一次执行的命令的返回状态,值为0,证明上一个命令执行正确,反之

root@iZwz9guplfkml2vvggil90Z:~# echo $w
2
# 上一个命令执行成功,返回 0
root@iZwz9guplfkml2vvggil90Z:~# echo $?
0
root@iZwz9guplfkml2vvggil90Z:~# h = 22
h: command not found
# 上一个命令执行失败,返回非 0
root@iZwz9guplfkml2vvggil90Z:~# echo $?
127

4. 运算符

  • $((运算式)) 或 $[运算式]
  • expr 表达式1 +,-,\*,/,% 表达式2
# 计算2+3
root@iZwz9guplfkml2vvggil90Z:~# echo $((2+3))
5
# 计算3-2
root@iZwz9guplfkml2vvggil90Z:~# echo $[3-2]
1
# 计算 2*3,注意空格
root@iZwz9guplfkml2vvggil90Z:~# expr 2 \* 3
6
# expr 计算 (2+3)*4
root@iZwz9guplfkml2vvggil90Z:~# expr `expr 2 + 3` \* 4
20
# $[] 计算 (2+3)*4
root@iZwz9guplfkml2vvggil90Z:~# echo $[(2+3)*4]
20

5. 条件判断

  1. 基本语法:

    [ condition ],[] 返回 false

    注意:condition 前后都有空格

  2. 常用判断条件

    1. 两个整数之间比较
      • -lt 小于(less than)
      • -le 小于等于(less equal)
      • -eq 等于(equal)
      • -gt 大于(greater than)
      • -ge 大于等于(greater equal)
      • -ne 不等于(Not equal)
    2. 按照文件权限进行判断
      • -r 有读的权限(read)
      • -w 有写的权限(write)
      • -x 有执行的权限(execute)
    3. 按照文件类型进行判断
      • -f 文件存在并且是一个常规的文件(file)
      • -e 文件存在(existence)
      • -d 文件存在并是一个目录(directory)
  3. 案例实操

    && 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令

    #23 是否大于等于 22
    root@iZwz9guplfkml2vvggil90Z:~# [ 23 -ge 22 ] && echo "true" || echo "false"
    true
    #para.sh 是否具有写权限
    root@iZwz9guplfkml2vvggil90Z:~# [ -w para.sh ] && echo "true" || echo "false"
    true
    #/root/shell/ccc.txt 文件是否存在
    root@iZwz9guplfkml2vvggil90Z:~# [ -f /root/shell/ccc.txt ] && echo "true" || echo "false"
    false
    

6. 流程控制

1. if

基本语法:

if [ 条件判断式1 ]
then 
   #do something..
elif [ 条件判断式2 ]
then 
   #do something..
else
   #do something..
fi

注意事项:

  1. if 后必须有空格
  2. [ 条件判断式 ],中括号和条件判断式之间必须有空格
  3. then 写 [ 条件判断式 ] 中间一定加 ;
# 输入一个数字,如果是1,输出"1";如果是2,输出"2",如果是其他,什么也不输出
root@iZwz9guplfkml2vvggil90Z:~# vi if

#!/bin/bash
  
if [ $1 -eq 1 ]
then
   echo "1"
elif [ $1 -eq 2 ]
then
   echo "2"
fi

root@iZwz9guplfkml2vvggil90Z:~# bash if 2
2
root@iZwz9guplfkml2vvggil90Z:~# bash if 1
1

2. case

基本语法:

case $变量名 in
"值1")
   #do something..
   ;;
"值2")
   #do something..
   ;;
....
*)
   #do something..
   ;;
esac

注意事项:

  1. case 行尾必须为 in
  2. 每一种模式匹配以 ) 结束
  3. ;; 相当于 Java 中的 break
  4. *) 表示默认模式,相当于 Java 中的 default
# 输入一个数字,如果是1,输出"1";如果是2,输出"2",如果是其他,输出"666"
root@iZwz9guplfkml2vvggil90Z:~# vi case

#!/bin/bash
  
case $1 in
1)
  echo "1"
  ;;
2)
  echo "2"
  ;;
*)
  echo "666"
;;
esac

root@iZwz9guplfkml2vvggil90Z:~# bash case 1
1
root@iZwz9guplfkml2vvggil90Z:~# bash case 2
2
root@iZwz9guplfkml2vvggil90Z:~# bash case 3
666

3. for

基本语法1:

for((初始值;循环控制条件;变量变化))
   do
     #do something...
   done
# 从1加到100
sdbserver1:~ # vi loop.sh

#!/bin/bash

s=0
for((i=1;i<=100;i++))
  do
    s=$[$s+$i]
  done
echo $s

sdbserver1:~ # bash loop.sh 
5050

基本语法2:

for 变量 in 值1 值2...
  do
     #do something...
  done
# 从1加到100
sdbserver1:~ # vi loop.sh

#!/bin/bash

s=0
for i in {1..100}
  do
    s=$[$s+$i]
  done
echo $s

sdbserver1:~ # bash loop.sh 
5050

4. while

基本语法:

while [ 条件判断式 ]
  do
      #do something...
  done
# 从1加到100
sdbserver1:~ # vi while.sh

#!/bin/bash

s=0
i=1
while [ $i -le 100 ]
  do
    s=$[$i+$s]
    i=$[$i+1]
  done
echo $s

sdbserver1:~ # bash while.sh 
5050

参考资料:

  1. 尚硅谷 Shell 课程
  2. 菜鸟课程 Shell 课程

你可能感兴趣的:(Linux)