Gled Fish

Shell 脚本编程

Shell 脚本编程

Shell 编程

Shell 简介

Shell 是 Linux 系统中的命令解释器,可以将人理解的指令转换成机器指令,达到操控硬件的目的。

第一个 Shell 脚本

#! /bin/sh
echo "hello, world!"
#这是一个注释
# #!后面是当前默认的命令行解析器
# echo 打印 hello, world!并以标准形式输出

父 shell 和子 shell

在 shell 中再启动一个 shell 进程,则该进程为子 shell,另一个 Shell 为父Shell

运行脚本

直接在当前shell 中运行:

  • source 目录/脚本名.sh
  • . 目录/脚本名.sh 创建子 shell 运行
  • ./脚本名.sh * 注意 / 与脚本名之间不能有空格

变量

变量分为系统变量和用户变量

系统变量:系统预定义的变量,一般以大写字母命名

# env 查看系统变量
# set 查看所有变量

用户变量:用户自定义的变量

系统变量在父/子 shell 中都可以访问,用户变量只在其定义中的 shell 中可以访问。

用户变量定义方法:

my_var=4
readonly read_var=hello #只读变量
# 访问变量
$my_var

注意:

  • 等号两边不能有空格
  • 默认定义为局部变量,使用以下命令上升为全局变量
export my_var
  • 子 shell 可以改变全局变量的值,但只在子 shell 中生效,在父 shell 访问时值并未改变。
  • 变量默认类型为字符串类型,不能进行数学运算
  • 撤销变量并释放内存,使用以下命令
unset my_var 
#不能 unset 只读变量

特殊变量

  • $0:获取脚本的名字

  • $1:获取第一个参数

  • $n:获取第 n 个参数

  • $#:获取脚本参数的个数

  • $*:输出所有参数

  • $@:输出所有参数

  • $?:获取脚本的运行状态,返回 0 脚本成功运行,返回非 0 值脚本运行不成功

运算

sum=$[4 + 6]#10
sum=$((4 + 6))#10
sum=$[$1 + $2]#获取第一个和第二个参数的值并计算结果
sum=$(($1 + $2))#获取第一个和第二个参数的值并计算结果

条件判断

字符串比较

a=hello
test $a = hello | echo $?
# 判断a是否等于hello,如果等于返回0,不等于返回1。
[ $a != hello ] | echo $?
# 判断a是否不等于hello,如果等于返回0,不等于返回1。
a=15
test $a = hello | echo $?
[ $a= hello ] | echo $?
#这里仍然属于字符串判断,shell 中的数学比较不能用 = > <等等,因为这些符号有它原来的意义,比如 > 重定向的作用

数学比较

a = 15
[ $a -gt 20 ] | echo $?
#判断 a 是否大于 20,大于返回 0,不大于返回 1。

数学比较符号

  • eq equal
  • ne not equal
  • gt greater than
  • ge greater equal
  • lt less than
  • le less equal

文件目录比较

[ -e filename ] | echo $?
#判断文件是否存在
[ -f filename ] | echo $?
#判断是不是一个文件
[ -d directoryname ] | echo $?
#判断是不是一个目录

权限判断

[ -r filename ] | echo $?
#判断是否具有写入权限
  • -r
  • -w
  • -x 多重判断
a=20
[ $a -lt 30 ] && echo "0" || echo "1" 
#判断 a 的值是否小于 30,是返回 0,否则返回 1。

流程控制

if语句

a=20
if [ $a -gt 18]
then 
    echo " > 18"
else
    echo " <= 18"
fi
# 判断 a 的值是否大于18
if [ $a -gt 18 -a $a -lt 35]
#  if [ $a -gt 18 ] && [ $a -lt 35 ] 也可以写成这样
then 
    echo "OK"
else
    echo " NO"
fi
# 判断 a 的值是否大于18且小于35
if [ $a -lt 18 ]
then
    echo "< 18"
elif [ $a -lt 35 ]
then 
    echo "< 35"
else
    echo ">= 35"
fi 

case语句


case $1 in
#判断第一个参数的值
1)
#如果等于 1,输出 one
    echo "one"
;;#标志结尾
2) 
    echo "two"
;;
3)
    echo "three"
;;
*)
#如果是其他情况
    echo "else"
;;
esac
#反转的case 标志 case语句的结尾

for循环

for ((i=0; i < $1; i++))
do      
    echo $i 
done
# do标示for循环体的开始
# done标示for循环语句的结束
# (()) 双括号内可以使用数学运算符

上面的for循环形式比较繁琐,还有另一种比较简洁的for循环。

for i in 1 2 3 4 5 
# for i in {1..5}
do 
    echo $i 
done 

while循环

i=1
while [ $i -lt $1]
do 
    echo $i
done
#i要在循环外初始化

读取用户输入

read -t 10 -p "请输入姓名:" name
echo $name 
#read 读取用户输入
# -t 指定等待输入的时间
# -p 输入提示信息
# 变量名 指定输入内容存储的变量

函数

系统函数

系统函数是系统预定义的函数,使用时可以直接调用。如:

basename: 获取文件名

dirname: 获取目录名

在脚本中调用系统函数并获取结果

command1=$(dirname)
# $()获取 dirname 函数执行的结果并赋值给 command1

自定义函数

function sum(){
    sum=$[ $1 + $2 ]
    echo $sum 
    return $?
}

# function可以省略,但一般不省略。
# 函数不需要形式参数,与脚本一致,使用位置参数
# return 语句可加可不加,如果不加,系统会自动添加。

# 调用函数
add=$(sum 1 2)

参考链接

https://www.bilibili.com/video/BV1WY4y1H7d3?p=1&vd_source=f09fa21118f68e116e074e2f6b4e14e4

(全文完) 以上内容只代表个人观点,如果对你有所帮助,点击这里给我一个小小的star

如果有任何问题欢迎随时联系我进行批评指正:2076577077@qq.com

我是gled fish, 点击这里来到我的博客网站:


尊重作者原创, 转载请注明作者和出处,请勿用于任何商业用途。

All rights reserved.