Linux实操之Shell脚本基本语法:脚本中的变量$n、$*、$@、$#,if,case,while,for,自定义方法

一、Shell介绍

  • Shell 既是 应用程序 又是 一种脚本语言
  • 站在连接外围应用层与操作系统内核的角度:Shell 是一个命令行解释器,它接收应用程序 / 用户命令,然后调用操作系统内核。
  • 站在使用Shell进行编程的角度:它还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。编写出 Shell脚本
    Linux实操之Shell脚本基本语法:脚本中的变量$n、$*、$@、$#,if,case,while,for,自定义方法_第1张图片

Shell脚本

shell脚本 本质上是 linux 命令,一条一条命令根据逻辑按照Shell编程的语法规则组合在一起,实现某一个目的,就变成了shell脚本。它从一定程度上 减轻了工作量,提高了工作效率。

二、脚本入门

1 格式

脚本文件第一行为:#!/bin/bash 或 #!/bin/sh 等。作用为指定Shell解释器
脚本命名:一般以.sh结尾。也可省略。

2 执行

  • 第一种方式:在子shell窗口执行,由命令解释器执行,不需要赋予脚本执行权限
    • bash 脚本相对路劲或绝对路径
    • sh 脚本相对路劲或绝对路径
  • 第二种方式:在子shell窗口执行,由当前用户执行,脚本需要可执行权限
    • 脚本相对路劲或绝对路径。
  • 第三种方式:在当前shell窗口执行。不需要赋予脚本执行权限
    • . 脚本相对路劲或绝对路径
    • source 脚本相对路劲或绝对路径
  • 第四种方式:需要将脚本添加到全局系统变量 PATH 中的特定路径下。
    • 使用脚本文件名直接执行

注意:在当前shell窗口执行和子shell窗口执行的区别在于:变量的作用域

三、变量

1 分类

第一种

  • 全局变量:子shell可见,子shell修改对父shell无效。
  • 局部变量:只对当前shell有效。

第二种

  • 系统变量:系统定义好的变量。$HOME,$PWD,$SHELL,$USER,$PATH。
  • 用户变量:用户自定义的变量。

2 查看

  • 打印指定的变量:echo $***
  • 打印所有系统全局变量:env 、 printenv
  • 打印指定的系统全局变量:printenv ***
  • 打印所有变量:set

3 自定义

  • 定义(用户、局部):变量名=变量值。注意,变量值由空格组成需用双引号括起来
  • 撤销:unset 变量名
  • 只读:readonly 变量名。不能 撤销重写赋值
  • 提升:export 变量名

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

(2)等号两侧不能有空格

(3)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。

(4)变量的值如果有空格,需要使用双引号或单引号括起来。

4 特殊变量

  • $n
    • $0:调用Shell程序执行脚本时,Shell 程序后面所加的脚本路劲。如 sh /root/桌面/demo,脚本中$0表示 /root/桌面/demo。
    • $1:第一个参数,以此类推。注意,10以上表示为 ${n}。
  • $*:所有参数的集合。
  • $@:所有参数的集合。
  • $#:所有参数个数。

注意:$*与$@区别在于使用for遍历"$*“时,只循环一次,值为所有参数集合。而使用for遍历”$@"时,循环次数为参数个数,值为对应的每个参数的值。

5 实操案例

[root@demo01 桌面]# cat demo1
#!/bin/bash
echo '===============$n================='
echo $0
echo $1
echo $2
echo '===============$#================='
echo $#
echo '===============$*================='
echo $*
echo '===============$@================='
echo $@
[root@demo01 桌面]# sh demo1 1 2 3
===============$n=================
demo1
1
2
===============$#=================
3
===============$*=================
1 2 3
===============$@=================
1 2 3
[root@demo01 桌面]# 

四、运算符表达式

  • 基本语法:expr 1 + 2,执行输出3

  • 简写语法:$((运算式)) 或 $[运算式]

  • 示例

    expr 1 + 2         输出3
    a=$(expr 1 + 2)    $a=3		命令替换
    a=`expr 1 + 2`	   $a=3		命令替换
    
    echo $[1+2]			输出3
    echo $((1+2))		输出3
    a=$[1+2] 			$a=3
    

五、条件表达式

  • 基本语法:test condition --> 取返回值:$?

  • 简写: [ condition ](注意 condition 前后要有空格)。注意:条件非空即为 true,[ haha ]返回 true,[ ] 返回 false

  • 示例:字符串之间用“=”判断相等,用“!=”判断不等

[root@demo01 桌面]# a=hello
[root@demo01 桌面]# [ $a = hello ]
[root@demo01 桌面]# echo $?
0
[root@demo01 桌面]# [ $a=Hello ]
[root@demo01 桌面]# echo $?
0
[root@demo01 桌面]# 
  • 逻辑运算符

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

    [ atguigu ] && echo OK || echo notOK
    
    [ condition -a condition ]  逻辑与and
    
    [ condition -o condition ]  逻辑或or
    

六、if

1 语法

  • 单分支(注意:使用“;”可以代替换行)
if [ 条件判断式 ]
then 程序
fi
  • 多分支
if [ 条件判断式 ]
	then 程序
elif [ 条件判断式 ]
	then 程序
else
	程序
fi

2 实操案例

[root@demo01 桌面]# cat demo2
#!/bin/sh
echo "====================根据第一个参数判断逻辑(if elif else fi)==================="
if [ "$1" = "1" ]
then 
    echo "我真帅!"
elif [ "$1" = "2" ]
then
    echo "我真美!"
elif [ -z $1 ]
then 
    echo "参数为空!"
else
    echo "其他参数逻辑!"
fi

echo "====================根据第一个参数判断逻辑(case in esac)==================="
case $1 in
"1")
    echo "我真帅!" ;;
"2")
    echo "我真美!" ;;
"")
    echo "参数不存在!" ;;
*)
    echo "其他参数逻辑!" ;;
esac
[root@demo01 桌面]# sh demo2 1
====================根据第一个参数判断逻辑(if elif else fi)===================
我真帅!
====================根据第一个参数判断逻辑(case in esac)===================
我真帅!
[root@demo01 桌面]# sh demo2 2
====================根据第一个参数判断逻辑(if elif else fi)===================
我真美!
====================根据第一个参数判断逻辑(case in esac)===================
我真美!
[root@demo01 桌面]# sh demo2 3
====================根据第一个参数判断逻辑(if elif else fi)===================
其他参数逻辑!
====================根据第一个参数判断逻辑(case in esac)===================
其他参数逻辑!
[root@demo01 桌面]# sh demo2 
====================根据第一个参数判断逻辑(if elif else fi)===================
参数为空!
====================根据第一个参数判断逻辑(case in esac)===================
参数不存在!
[root@demo01 桌面]# 

七、case

1 语法

case $变量名 in
"值1")
	如果变量的值等于值 1,则执行程序 1
	;;
"值2")
	如果变量的值等于值 2,则执行程序 2
	;;
*)
	如果变量的值都不是以上的值,则执行此程序
	;;
esac

2 案例实操

[root@demo01 桌面]# cat demo2
#!/bin/sh
echo "====================根据第一个参数判断逻辑(if elif else fi)==================="
if [ "$1" = "1" ]
then 
    echo "我真帅!"
elif [ "$1" = "2" ]
then
    echo "我真美!"
elif [ -z $1 ]
then 
    echo "参数为空!"
else
    echo "其他参数逻辑!"
fi

echo "====================根据第一个参数判断逻辑(case in esac)==================="
case $1 in
"1")
    echo "我真帅!" ;;
"2")
    echo "我真美!" ;;
"")
    echo "参数不存在!" ;;
*)
    echo "其他参数逻辑!" ;;
esac
[root@demo01 桌面]# sh demo2 1
====================根据第一个参数判断逻辑(if elif else fi)===================
我真帅!
====================根据第一个参数判断逻辑(case in esac)===================
我真帅!
[root@demo01 桌面]# sh demo2 2
====================根据第一个参数判断逻辑(if elif else fi)===================
我真美!
====================根据第一个参数判断逻辑(case in esac)===================
我真美!
[root@demo01 桌面]# sh demo2 3
====================根据第一个参数判断逻辑(if elif else fi)===================
其他参数逻辑!
====================根据第一个参数判断逻辑(case in esac)===================
其他参数逻辑!
[root@demo01 桌面]# sh demo2 
====================根据第一个参数判断逻辑(if elif else fi)===================
参数为空!
====================根据第一个参数判断逻辑(case in esac)===================
参数不存在!
[root@demo01 桌面]# 

八、for

1 语法

  • 基本语法

    for(( 初始值;循环控制条件;变量变化))
    do
    	程序
    done
    
    for i in 值1 值2 值3		注意:也可 for i in {1..100}
    do
    	程序
    done
    

2 案例实操

[root@demo01 桌面]# cat demo3
#!/bin/bash
echo "============1)打印所有参数=================="
for item in "$@"
do
    echo $item
done

echo '============2)比较$*和$@的区别=============='
echo '===================$*======================='
for item in "$*"
do 
    echo $item
done
echo '==================$@========================'
for item in "$@"
do
    echo $item
done

echo "===========3)fori语法计算1到100的和========="
a=0
for ((i=1;i<=100;i++))
do
   a=$(($a+$i))
done
echo "1到100相加的和为:$a" 

echo "==============4)while语法:从1加到100==========="
a=1
sum=0
while [ $a -le 100 ]
do
	sum=$(($sum+$a))
	a=$(($a+1))
done
echo "1到100的和为:$sum"
[root@demo01 桌面]# sh demo3 1 2 3
============1)打印所有参数==================
1
2
3
============2)比较$*$@的区别==============
===================$*=======================
1 2 3
==================$@========================
1
2
3
===========3)fori语法计算1到100的和=========
1到100相加的和为:5050
==============4)while语法:从1加到100===========
1到100的和为:5050
[root@demo01 桌面]# 

九、while

1 语法

  • 基本语法

    while [ 条件判断式 ]
    do
    	程序
    done
    

2 案例实操

[root@demo01 桌面]# cat demo3
#!/bin/bash
echo "============1)打印所有参数=================="
for item in "$@"
do
    echo $item
done

echo '============2)比较$*和$@的区别=============='
echo '===================$*======================='
for item in "$*"
do 
    echo $item
done
echo '==================$@========================'
for item in "$@"
do
    echo $item
done

echo "===========3)fori语法计算1到100的和========="
a=0
for ((i=1;i<=100;i++))
do
   a=$(($a+$i))
done
echo "1到100相加的和为:$a" 

echo "==============4)while语法:从1加到100==========="
a=1
sum=0
while [ $a -le 100 ]
do
	sum=$(($sum+$a))
	a=$(($a+1))
done
echo "1到100的和为:$sum"
[root@demo01 桌面]# sh demo3 1 2 3
============1)打印所有参数==================
1
2
3
============2)比较$*$@的区别==============
===================$*=======================
1 2 3
==================$@========================
1
2
3
===========3)fori语法计算1到100的和=========
1到100相加的和为:5050
==============4)while语法:从1加到100===========
1到100的和为:5050
[root@demo01 桌面]# 

十、函数

1 介绍

含义:一个简化、灵活、缩小版的脚本。命令、脚本是函数的集合。

分类:

​ 内置命令:

​ 外部命令:通常称之为工具

2 系统函数

date +%y%m%d

  • 基本使用(脚本中调用需要命令替换):$(date)

basename [string / pathname] [suffix]

suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

  • 基本使用(脚本中调用需要命令替换):$(basename)

dirname 文件路径:去除 “/文件名” 后的路径

dirname :当前绝对路径

  • 基本使用(脚本中调用需要命令替换):$(dirname)

3 自定义函数

(1)基本语法

function funname()											
{
	Action;
	[return int;]
}
  • 函数返回值,只能通过$?系统变量获得
  • 可以用:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
  • return 后跟数值 n(0-255)

4 案例实操

[root@demo01 桌面]# cat demo4
#!/bin/bash
echo "========计算两个输入参数的和:自定义方法+控制台输入read==========";
function sum(){
echo "计算两个参数的和"
read -t 60 -p "请输入第一个参数:" AAA
if [ -z $AAA ]
then 
   echo "超时未输入参数,退出!"
   return -1
fi
read -t 60 -p "请输入第二个参数:" BBB
if [ -z $BBB ]
then 
   echo "超时未输入参数,推出!"
   return -1
fi
SUM=$(($AAA+$BBB))
echo "两数之和为:$SUM"
return 0
}
sum;

[root@demo01 桌面]# sh demo4
========计算两个输入参数的和:自定义方法+控制台输入read==========
计算两个参数的和
请输入第一个参数:15156
请输入第二个参数:5161
两数之和为:20317
[root@demo01 桌面]# 

你可能感兴趣的:(#,Linux,linux,bash,运维)