shell脚本入门

  • Shell脚本是一种用于在Unix/Linux系统的命令行环境中自动执行任务的脚本程序
  • 由一系列Shell命令和控制结构组成,可以批量处理重复性操作、管理系统、处理文件或执行复杂逻辑
  • shell脚本编写流程
    • 需求分析
    • 命令测试
    • 脚本编写
    • 测试调优
  • 执行shell脚本:
bash test.sh
source test.sh
./test.sh

变量

用户自定义变量

COUNT=1
echo $COUNT
Z=hello
echo $Z
unset Z
echo $Z

特殊变量

只读变量

  • 变量值不允许修改(重新赋值)的情况
  • 无法使用 unset删除
  • readonly

位置变量和预定义变量

  • $0 与键入的命令行一样,脚本文件名
  • $1,$2,……$9 ${10} 分别包含第一个到第十个命令行参数
  • $# 命令行参数的个数
  • $@ 命令行所有参数:“$1,$2,……$9”
    • 每个参数可独立处理,适合逐个遍历
  • $* 命令行所有参数,:“$1,$2,……$9”
    • 是一个整体,通常用于拼接
  • $? 前一个命令的执行状态,执行成功,返回0,否则返回非0
  • $$ 当前进程的pid进程号

环境变量

  • $USER 表示用户名称
  • $HOME 表示用户的宿主目录
  • $PWD 表示当前所在工作目录
  • $PATH 表示可执行用户程序的默认路径

语句

说明性语句

  • 以#号开始到该行结束,不被解释执行注释行可以出现在程序中的任何位置,既可以单独占用一行, 也可以接在执行语句的后面
  • 以#号开始到所在行的行尾部分,都不被解释执行

功能性语句

read命令

  • 功能:从标准输入(键盘)或文件描述符读取用户输入,并将值赋给变量
  • 语法:read [选项] [变量名1 变量名2 ...]
  • 常用选项:
    • -p 显示提示信息 <font style="color:rgb(51,51,51);">read -p "请输入用户名:" username</font>
    • -t 设置输入超时时间 <font style="color:rgb(51,51,51);">read -t 5 -p "输入倒计时:"</font>
    • -s 静默模式,隐藏内容,如输入密码 read -s -p "密码:" password

算数运算

expr命令
  • sum=$(expr 5 + 3)
  • sum=expr 5 + 3``
  • C=$(( (A+B)*2))
  • C=expr ( $A + $B ) * 2``

需要用命令置换符``时,乘法需要转义,特别注意空格问题

$((……))展开命令
  • echo $(( (5 + 3) * 2 ))
  • 乘法无需转义,支持逻辑运算
  • C=$(( ( A + B ) * 2))
  • 变量名可以不加 $ 符号直接使用
let 命令
  • let a=5 + 3 # a=8
  • 变量可以直接使用,特别注意空格细节

test命令

写法
  • test 表达式
    • 标准写法,推荐
  • [ 表达式 ]
    • 方括号写法(需注意表达式与方括号间的空格)
数值比较
  • -eq 等于则为真 test $num1 -eq $num2
  • -ne 不等于则为真 [ $a -ne $b ]
  • -gt 大于则为真 test 10 -gt 5
  • -ge 大于等于则为真 [ $count -ge 100 ]
  • -ge 大于等于则为真 [ $count -ge 100 ]
  • -le 小于等于则为真 [ $score -le 60 ]
字符串测试
  • = / == 字符串相等则为真 <font style="color:rgb(51,51,51);">test "$str1" = "$str2"</font>
  • != 字符串不等则为真 <font style="color:rgb(51,51,51);">[ "$var" != "exit" ]</font>
  • -z 字符串长度为0则为真 <font style="color:rgb(51,51,51);">test -z "$input"</font>
  • -n 字符串长度非0则为真 <font style="color:rgb(51,51,51);">[ -n "$username" ]</font>
文件测试
  • -e 文件存在则为真 test -e /path/to/file
  • -f 是普通文件则为真 [ -f "data.txt" ]
  • -d 是目录则为真 test -d /home/user
  • -r 文件可读则为真 [ -r config.ini ]
  • -w 文件可写则为真 test -w log.txt
  • -x 文件可执行则为真 [ -x script.sh ]
  • -s 文件存在且非空则为真 test -s output.log
逻辑运算
  • -a 逻辑与(AND) test -e file.txt -a -r file.txt
  • -o 逻辑或(OR) [ $age -gt 18 -o "$role" = "admin" ]
  • ! 逻辑非(NOT) test ! -d /invalid_path

[[ $num -gt 10 && "$str" != "error" ]] #bash中推荐&&、||

控制语句

分支语句

单分支
  • 语法
if [ 条件判断 ]; then
  # 条件成立时执行的代码
fi
  • 示例
#!/bin/bash
A=3
B=3
if test $A -eq $B ;then
  echo "A=B"
fi
if [ $A -eq $B ];then
  echo "A=B"
fi
双分支
  • 语法
if [ 条件判断 ]; then
  # 条件成立时执行
else
  # 条件不成立时执行
fi
  • 示例
#!/bin/bash
if [[ -e "file" && -f "file" ]]
then
  echo "yes"
else
  touch file
fi
多路分支
  • 语法
if [ 条件1 ]; then
  # 条件1成立时执行
elif [ 条件2 ]; then
  # 条件2成立时执行
else
  # 所有条件均不成立时执行
fi
  • 示例
#!/bin/bash
# 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,猜小了或猜大了
# 使用取余算法将随机数变为 1‐100 的随机数
num=$((RANDOM%100+1))
echo "$num"
# 使用 read 提示用户猜数字
read -p "计算机生成了一个 1‐100 的随机数,你猜: " number
if [ $number -eq $num ]
then
  echo "恭喜,猜对了"
elif [ $number -gt $num ]
then
  echo "Oops,猜大了"
else
  echo "Oops,猜小了"
fi
多路分支case
  • 语法
case 变量 in
  模式1)
    命令1
    ;;
  模式2|模式3) # 支持逻辑或`|`匹配多个模式
    命令2
    ;;
  *) # 默认分支(匹配其他所有情况)
    默认命令
    ;;
esac
  • 示例
#!/bin/bash
file="A_9"
case $file in
  *.jpg|*.png)
    echo "图像文件" ;;
  *.txt|*.md)
    echo "文本文件" ;;
  [A-Za-z]_[0-9])
    echo "字母+下划线+数字格式" ;;
  *)
    echo "未知类型" ;;
esac

循环语句

for

  • 语法
for 变量 in 元素1 元素2 ... 元素N
do
  # 执行命令(使用 $变量)
done
  • 示例
for file in `ls`
do
	echo "文件:$file"
done

while语句

  • 语法
while [ 条件 ]
do
  # 执行的命令
done
  • 示例
#!/bin/bash

while [ "$input" != "exit" ]
do
	read -p "input your text(exit will quit) " input
	echo "your input:$input"
done

循环控制语句

  • break :跳出整个循环
  • continue :跳过当前迭代,进入下一次循环
count=1
while [ $count -lt 5 ]
do
	if [ $count == 2 ]
	then
		#break
		count=`expr $count + 1`
		continue
	fi
	echo "$count"
	count=`expr $count + 1`
done
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值