Shell脚本

1、

myScript: 脚本代码分享


2、shell脚本基础

1. 脚本概述

  • 首行: #!/bin/bash

    • 这是脚本的解释器指示,告诉系统使用 bash 解释器来运行脚本。
  • 性质: Shell 脚本是一种解释性语言,脚本中的命令由 Shell 逐行解释和执行,而不是编译成二进制代码。

  • 后缀: .sh(虽然后缀不是强制要求,但它有助于标识文件类型)

2. 执行方式

  1. 给予执行权限:

    chmod +x 1.sh
  2. 通过 Shell 直接运行:

    ./1.sh
  3. 通过 bash 解释器执行:

    bash 1.sh

3. Shell 脚本的变量

3.1 自定义变量

  • 定义和使用:

    val=123 echo $val
  • 注意事项:

    • 赋值时: 等号两侧不能有空格,例如 val=123
    • 变量引用:
      • 123:没有格式。
      • '123':字符串常量,不解析变量。
      • "123":可以解析变量,使用 ${} 语法引用变量值。
  • 删除变量:

    unset val
  • 局部变量:

    local val
  • 命令替换:

    path=$(pwd) # 或使用反引号:path=`pwd`

3.2 位置变量

  • \$0:脚本名称。
  • \$1 - \$9:第一个到第九个命令行参数。
  • ${10}:第十个及之后的命令行参数。

3.3 预定义变量

  • $#:命令行参数个数。
  • $@:所有命令行参数。
  • $?:前一个命令的退出状态。(函数返回值等)
  • $*:所有命令行参数(和 $@ 类似,但处理方式略有不同)。
  • $$:当前进程的进程ID。

3.4 环境变量

  • 使用 env 命令查看当前终端的环境变量。
    env

4. 功能性

4.1 printf

  • 语法:

    printf "Hello\n"
  • printf "%d\n" 80
  • printf "%-6d\n" 80
  • 特点:

    • 与 C 语言中的 printf 类似,支持格式控制符和修饰符。

4.2 read

  • 从终端获取输入:

    read variable1 variable2
  • 选项:

    • -p:提示信息
      read -p "Please input number:" n
    • -t:限制输入时间(秒)
      read -t 5 n
    • -n:限制输入长度(字符数)
      read -n 5 n
    • -s:隐藏输入
      read -s n

4.3 test

  • 测试结果: 使用 $? 获取测试命令的退出状态(0 表示真,1 表示假)。

  • 字符串测试:

    test "string1" = "string2"
  • test "string1" != "string2"
  • test -z "string" # 检查字符串是否为空
  • test -n "string" # 检查字符串是否非空
  • 数字比较:

    test 5 -eq 5 # 等于
  • test 5 -ne 6 # 不等于
  • test 5 -gt 4 # 大于
  • test 5 -lt 6 # 小于
  • test 5 -ge 4 # 大于等于
  • test 5 -le 6 # 小于等于
  • 文件测试:

    test -f file # 是否为普通文件
  • test -d dir # 是否为目录
  • test -r file # 文件是否可读
  • test -w file # 文件是否可写
  • test -x file # 文件是否可执行
  • - L // 是否为链接文件 .. 链接文件用 -f 也能检测出来
    - S // 是否为套接字文件
    - p // 是否为管道文件
    - f // 是否为普通文件
    - b // 是否为块设备文件
    - c // 是否为字符设备文件
    - d // 是否为目录文件
    - r // 文件是否可读
    - w // 文件是否可写
    - x // 文件是否可执行
    - O // 是否为文件的拥有者
    - G // 是否与文件拥有者同组
    - s // 检查文件是否为空
    f1 - nt f2 //f1 是否比 f2
    f1 - ot f2 //f1 是否比 f2
    - e // 文件是否存在

4.4 expr

  • 算术运算:

    expr 1 + 2 val=$(expr 6 \* 3)
  • 替代用法:

    • 使用 $((...)) 进行算术运算:

      val=$((2 * 3))
    • 使用 let

      let val=2*3 let val++
    • 使用 ** 进行指数运算:

      val=$((2**3)) # 2 的 3 次方
    • 在现代 Bash 脚本中,应该使用 $(( )) 进行数学运算

4.5 typeset

  • 设置变量类型:

    • -u:将变量内容转为大写。
    • -l:将变量内容转为小写。(L)
    typeset -u var # 转为大写 typeset -l var #

5、 分支语句

5.1条件语句

if 条件
then
  命令集1
else
  命令集2
fi

if 条件1
then
  命令集1
elif 条件2
then
  命令集2
else
  命令集2
fi

5.2选择语句

使用 test 命令:

test -e $file -a -s $file  # 所有的test语句

逻辑运算:

  • -a // 逻辑与
  • -o // 逻辑或
  • ! // 非

 注:

&& 和 || 的用法
  • && 和 || 是逻辑运算符,用于在命令行或脚本中控制命令的执行流程:
    • command1 && command2:只有当 command1 成功(返回状态码为0)时,command2 才会执行。
    • command1 || command2:只有当 command1 失败(返回状态码非0)时,command2 才会执行。
2. -a 和 -o 的用法
  • -a 和 -o 是 test 命令(或 [ ... ])的选项,用于测试条件:
    • test expression1 -a expression2 或 [ expression1 -a expression2 ]:逻辑与,只有当 expression1 和 expression2 都为真时,结果才为真。
    • test expression1 -o expression2 或 [ expression1 -o expression2 ]:逻辑或,只要 expression1 或 expression2 其中之一为真,结果就为真。
3. 替换示例
逻辑与 (&& 和 -a)

test 命令中,逻辑与 -a 可以用 && 替代。例如:

 
 
# 使用 -a
[ -e file1 -a -e file2 ]

# 使用 &&
[ -e file1 ] && [ -e file2 ]

这两个命令都检查 file1file2 是否同时存在。它们的效果是一样的,但语法略有不同。

逻辑或 (|| 和 -o)

test 命令中,逻辑或 -o 可以用 || 替代。例如:

 
 
# 使用 -o
[ -e file1 -o -e file2 ]

# 使用 ||
[ -e file1 ] || [ -e file2 ]

这两个命令都检查 file1file2 是否存在其中之一。它们的效果也一样。

4. 注意事项
  • 使用 && 和 || 时,条件是针对整个命令的退出状态码,而 -a 和 -o 是针对 test 命令内部的表达式。
  • 在某些环境中(尤其是旧版本的 sh),-a 和 -o 可能会导致一些意外的行为。现代的 Bash 和其他 shell 支持 && 和 || 的逻辑操作通常更为直观和可靠。
总结
  • && 和 || 用于控制命令的执行,适合于复杂的逻辑条件。
  • -a 和 -o 是 test 命令的选项,用于在条件测试中进行逻辑操作。

 使用方括号 [ ]

[ -e $file ]  # 前者里面必须用空格和[]隔开,里面可以写所有test的内容
[ -e $file ] && [ -e $file ]
[ -e $file ] || [ -e $file ]
! [ -e $file ]

在 shell 脚本中,[ ](( )) 用于不同类型的测试和运算:

1. 方括号 [ ]

  • 用于进行测试条件,主要用于检查文件属性、字符串比较和整数比较。
  • [ -f file ]        # 检查文件是否存在且是普通文件
    [ "$str1" = "$str2" ]  # 字符串比较
    [ $num1 -eq $num2 ]    # 整数比较
    

2. 双圆括号 (( ))

  • 用于算术运算和条件判断,只适用于整数运算。
  • (( num1 == num2 ))   # 整数比较
    (( sum = num1 + num2 ))  # 算术运算
    

总结

  • [ ] 用于文件测试和字符串/整数比较,支持广泛的测试条件。
  • (( )) 专注于整数运算和比较,语法更简洁,且无需引号。

case 语句 

case $变量 in
模式1)
  命令表1
  ;;
模式2 | 模式3)  # 模式2或者模式3都符合
  命令表2
  ;;
…
模式n)  # *通配
  命令表n
  ;;
esac

脚本示例

求三个数中的最大值

#!/bin/bash
echo "输入三个数:"
read a
read b
read c

max=$a
if [ $b -gt $max ]; then
  max=$b
fi
if [ $c -gt $max ]; then
  max=$c
fi

echo "最大值是: $max"

文件存在性检查及处理

#!/bin/bash
echo "输入文件名:"
read filename

if [ -e $filename ]; then
  echo "文件存在。是否删除并重建文件?(y/n):"
  read answer
  if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
    rm $filename
    touch $filename
    echo "文件已重建。"
  elif [ "$answer" = "n" ] || [ "$answer" = "N" ]; then
    echo "程序退出。"
    exit 0
  else
    echo "无效的输入。"
  fi
else
  touch $filename
  echo "文件已创建。"
fi

 


循环结构:

# while
# while 表达式
# do
#     命令集;
# done
# 1-n
# read -p "求1+2..n
# " n
# while (( n > 0 )) 
#     do
#         sum=$(( n + sum )) 
#          ((n-- ));
# done
# echo $sum
# while [ $n -ge 0 ]
#     do
#         sum=$[ n + sum ]
#         # let n--
#         # n=$[ n - 1 ]
#         ((n--))
# done
# echo $sum
# 
# break n  跳出n层循环
# continue n 
# while true
#     do
#         echo "1"
#         while true
#             do
#              echo "2"
#                 while true
#                     do
#                      echo "3"
#                         break 3
#                         done
#                 done
#         done
# for((i=1;i<=100;i++))
# do
#     sum=$[sum+i]
# done
# echo $sum

        while:

    

 for:

break:

continue:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值