shell基本语法 | 青训营笔记

142 阅读3分钟

1. 变量

1.1 类型

  • 系统环境变量

    • 作用域: 所有shell
    • 设置方式:启动加载
  • 环境变量

    • 作用域: 当前shell及其子shell
    • 设置方式: export、 declare -x
  • 自定义变量

    • 作用域: 当前shell
    • 设置方式: 使用=赋值
    • 类型: 字符串、整形、浮点型、日期型
#! /bin/bash

# 变量名=变量值  等号左右不能有空格
page_num=2
page_size=1

# 可以将命令赋值给变量
_ls=ls

# 默认为字符串,不会进行运算
total=page_size*page_num
# total --> "page_size*page_num"


# 声明为整形
let total=page_size*page_num
declare -i total=page_size*page_num

# 声明环境变量
export total
declare -x total

declare命令语法:

declare [+/-][rxi][变量名称=设置值] 或 declare -f

参数:

  • +/-  "-"可用来指定变量的属性,"+"则是取消变量所设的属性。
  • -f  仅显示函数。
  • r  将变量设置为只读。
  • x  指定的变量会成为环境变量,可供shell以外的程序来使用。
  • i  [设置值]可以是数值,字符串或运算式。
  • -p 显示被声明的变量的变量类型
  • a 将变量声明为数组类型

1.2 系统环境变量

  • $0: 当前shell脚本文件名,可以使用11、2获取传入参数
  • $#: 传入参数的个数,可以用来判断有无参数传入
  • $*: 传入的所有参数
  • $?: 上条命令执行的状态码,可以用来判断是否为0
  • $PS1: shell的命令提示符
  • $HOME: 用户目录
  • $PATH: 全局命令搜索路径,一般使用PATH=$PATH:[新增路径]

2. 运算符

2.2 算术运算符

运算符说明举例
+加法expr \$a + $b 结果为 30。
-减法expr \$a - $b 结果为 -10。
*乘法expr \$a \* $b 结果为  200。
/除法expr \$b / $a 结果为 2。
%取余expr \$b % $a 结果为 0。
=赋值a=$b 把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

2.3 关系运算符

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

2.4 逻辑运算符

运算符说明举例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||逻辑的 OR[[ $a -lt 100 | $b -gt 100 ]] 返回 true

2.5 字符串运算符

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否不相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否不为 0,不为 0 返回 true。[ -n "$a" ] 返回 true。
$检测字符串是否不为空,不为空返回 true。[ $a ] 返回 true。

2.6 其他符号

image.png

3. 分支

# 第一种形式:
if [ $a == $b ]  
then  
   echo "a 等于 b"  
elif [ $a -gt $b ]  
then  
   echo "a 大于 b"  
elif [ $a -lt $b ]  
then  
   echo "a 小于 b"  
else  
   echo "没有符合的条件"  
fi
# 第二种形式:
echo '输入 1 到 4 之间的数字:'  
echo '你输入的数字为:'  
read aNum  
case $aNum in  
    1)  echo '你选择了 1'  
    ;;  
    2)  echo '你选择了 2'  
    ;;  
    3)  echo '你选择了 3'  
    ;;  
    4)  echo '你选择了 4'  
    ;;  
    *)  echo '你没有输入 1 到 4 之间的数字'  
    ;;  
esac

4. 循环

  • while循环

int=1  
while(( $int<=5 ))  
do  
    echo $int  
    let "int++"  
done

  • until循环
a=0  
  
until [ ! $a -lt 10 ]  
do  
   echo $a  
   a=`expr $a + 1`  
done

  • for循环
for loop in {1..5} 
do  
    echo "The value is: $loop"  
done

5. 函数

  • 语法1
funcName(){
    echo "function!";
}
  • 语法2
function funcName(){
    echo "function!";
}
  • 参数
funWithParam(){  
    echo "第一个参数为 $1 !"  
    echo "第二个参数为 $2 !"  
    echo "第十个参数为 $10 !"  
    echo "第十个参数为 ${10} !"  
    echo "第十一个参数为 ${11} !"  
    echo "参数总数有 $# 个!"  
    echo "作为一个字符串输出所有参数 $* !"  
}  
funWithParam 1 2 3 4 5 6 7 8 9 34 73

6. 模块化

模块化的原理是在当前shell内执行函数文件

语法: source [函数库路径]

实例:

# 文件1
function add(){
    declare -i result=$1+$2
    
    echo $result
}

# 文件2
source './文件1'
total=${add 1 2}
echo $total

7. 注意事项

  1. 空格和引号:Shell对空格和引号的使用非常敏感。确保在适当的位置使用空格来分隔命令和参数,但不要在变量赋值或条件判断等语句中的等号两边使用空格。同时,使用引号(单引号或双引号)来引用包含空格或特殊字符的参数,以避免解析错误。

  2. 转义字符:某些特殊字符具有特殊意义,例如\$"\等,如果想要使用它们的字面值,需要使用转义字符\进行转义。例如,要打印"$10",可以使用echo "\$10"

  3. 变量扩展:在使用变量时,确保适当地进行变量扩展。使用$符号来引用变量的值,并使用大括号{}来明确界定变量的范围。例如,${name}用于引用变量name的值。

  4. 文件路径:在编写脚本时,要小心处理文件路径。使用相对路径或绝对路径时要确保路径的正确性,并注意文件和目录的权限。

  5. 错误处理:在脚本中考虑错误处理是很重要的。使用条件语句和返回值来检查命令是否成功执行,并采取相应的操作,例如输出错误消息、终止脚本等。

  6. 注释:使用注释来解释脚本的功能和逻辑,使其更易读和易于维护。使用#符号来注释单行,或使用:来注释多行。

  7. 输入输出重定向:使用重定向符号>>>来将命令的输出重定向到文件,使用<来将文件作为命令的输入。同时,使用管道符号|将命令的输出传递给另一个命令进行处理。

  8. 运行权限:在运行Shell脚本之前,确保脚本文件具有执行权限。可以使用chmod +x script.sh命令添加执行权限。