shell脚本学习

shell脚本学习


前言

shell是一种在操作系统之上发展的应用程序,用户可以通过shell来指挥内核,让内核完成我们所需的硬件任务。这种应用程序像鸡蛋一样包裹着内核,因此也成为壳程序(shell)。
在这里插入图片描述


一、shell脚本编写与执行

1.1 shell脚本格式

shell脚本以#!/bin/bash开头,声明脚本使用的shell名称(指定解析器)

注意:

  • 命令从上而下、从左而右执行
  • 命令、选项与参数间的多个空格会被忽略掉
  • 空白行会被忽略,【TAB】所产生的空白同样视为空格键
  • 如果读取到一个【ENTER】(CR),就尝试开始执行该行命令
  • 如果一行内容太多,可以使用【\【ENTER】】扩展至下一行
  • 除【#!】用来加载环境配置外,【#】可作为注释忽略,【#】后边数据将被视为注释文字

1.2 执行shell脚本

  1. sh/bash + shell脚本相对/绝对路径
sh ./helloworld.sh
sh /home/script/helloworld.sh
bash ./helloworld.sh
bash /home/script/helloworld.sh
  1. 先赋予脚本可执行权限,再直接使用相对/绝对路径执行脚本
####赋予脚本可执行权限####
chmod +x helloworld.sh
###相对路径###
./helloworld.sh
###绝对路径###
/home/script/helloworld.sh
  1. 使用.或source + 脚本路径执行脚本
. helloworld.sh
source helloworld.sh

注意:

  • 第一种方法本质是使用bash解析器来执行脚本,所以脚本本身不需要执行权限
  • 第二种方法本质是脚本本身执行,需要执行权限
  • 第一、二种方法都是在当前shell中开启一个子shell来执行脚本,脚本结束后子shell关闭回到父shell
  • 第三种方法可以使得脚本在当前shell执行无需开启子shell
  • 是否开启子shell的区别在于环境变量的继承关系,子shell设置的当前变量对于父shell而言是不可见的

1.3 read读取控制台输入

语法:read (选项)(参数)

选项:

  • -p:指定读取值时的提示符
  • -t:指定读取值时等待的时间(秒),如果不加-t表示一直等待

参数:

  • 变量——指定读取值的变量名

例:

#!/bin/bash
read -t 5 -p "Enter your answer in 5 seconds: " ANSWER
echo $ANSWER

二、变量

2.1 系统预定义变量

常用的系统变量:
$HMOE、$PWD、$SHELL、$USER等

使用echo可查看变量的值
使用set可显示shell中所有变量

2.2 自定义变量

2.2.1 定义变量

定义变量语法:变量名=变量值
声明静态变量:readonly 变量名,不能unset
变量设置规则:

  • 变量与变量内容使用一个【=】连接,【=】两边不能有空格
  • 变量名只能是英文字母与数字,开头字符不能是数字
  • 变量内容若有空格可以使用双引号【"】或单引号【'】将内容结合起来

注意:

  • 双引号内的特殊字符如$等可保持原本特性
  • 单引号内特殊字符仅为一般字符,视为纯文本
  • 在bash中变量默认类型都是字符串类型,故无法直接进行数值运算

例:

var1="lang is $LANG"#lang is zh_CN.UTF-8
var2='lang is $LANG'#lang is $LANG
var3=1#定义变量var3
var3=2#变量var3重新赋值
var4=1+2
echo $var4#1+2

2.2.2 撤销定义变量

语法:unset 变量名
注意不能用unset处理readonly静态变量

var1="lang is $LANG"#lang is zh_CN.UTF-8
unset var1
readonly var2=2
echo $var2

shell中的运算符:
$((运算式))$[运算式]
例如:

sum=$[(1+2)*3]
sum=$[$sum+1]
echo $sum

2.2.3 使变量变为环境变量

如果改变了需要在其它子程序调用,需要用export将变量升为全局环境变量
语法:export 变量名

var5="Hello World!”
export var5

2.3 特殊变量

2.3.1 $n

$n:n为数字,$0表示脚本名称,$1-$9表示第1-9个参数,但n大于等于10时需要用大括号包裹起来,如${13}

2.3.2 $#

$#获取所有输入参数个数,常用于循环,判断参数隔宿是否正确以及增强脚本的健壮性

2.3.5 $*

$*代表命令行中所有的参数,并把所有的参数看成一个整体

2.3.5 $@

$@代表命令行中所有的参数,并把每个参数区分对待

2.3.5 $?

$?描述最后一次执行任务的状态,若该变量值为0说明上一个程序正常执行;若该变量值非0,则表明上一个程序执行不正确

2.3.6 说明例程

[vvvcxjvvv@localhost shell_scripts]$ cat parameter_test.sh
#!/bin/bash
echo '---------$n-----------'
echo $0
echo $1
echo $2

echo '---------$#-----------'
echo $#

echo '---------$*-----------'
echo $*

echo '---------$@-----------'
echo $@


echo 'difference between $* and $@'

echo '$* test:'
for i in $*
do
	echo $i
done


echo '$@ test:'
for i in $@
do
	echo $i
done


echo 'difference between "$*" and "$@"'

echo '"$*" test:'
for i in "$*"
do
	echo $i
done


echo '"$@" test:'
for i in "$@"
do
	echo $i
done
[vvvcxjvvv@localhost shell_scripts]$ sh parameter_test.sh Hello World Linux Shell
---------$n-----------
parameter_test.sh
Hello
World
---------$#-----------
4
---------$*-----------
Hello World Linux Shell
---------$@-----------
Hello World Linux Shell
difference between $* and $@
$* test:
Hello
World
Linux
Shell
$@ test:
Hello
World
Linux
Shell
difference between "$*" and "$@"
"$*" test:
Hello World Linux Shell
"$@" test:
Hello
World
Linux
Shell

解释:
echo $0、echo $1、echo $2=====>分别输出脚本名、第一个参数、第二个参数
echo $# 输出参数个数
echo $*、echo $@ 输出所有传入的参数
for循环遍历 $*与$@, $*与$@中的每一个元素代表一个参数($i)
for循环遍历 “$*”(双引号包括起来),循环只执行一次,所有的参数看成一个整体
for循环遍历 “$@”(双引号包括起来),"$@"会将各个参数分开(独立),逐个输出参数

三、条件判断

3.1 基本语法

语法:

  • test condition
  • 【condition】

条件非空为true,例如[hello]返回true,[ ]返回false

3.2 判断条件

  1. 整数之间大小比较
判断条件描述
-eqequal,等于
-nenot equal,不等于
-ltless than,小于
-leless equal,小于等于
-gtgreater than,大于
-gegreater equal,大于等于
  1. 字符串比较
判断条件描述
=两字符串相等
!=两字符串不等
  1. 文件权限判断
判断条件描述
-r文件可读
-w文件可写
-x文件可执行
  1. 文件类型判断
判断条件描述
-eexistence,文件存在
-f文件存在且文件是一个常规文件(file)
-d文件存在且文件是一个目录(directory)

四、流程控制

4.1 if语句

单分支:

####语法1###
if [ 条件判断式 ];then
	执行程序
fi
####语法2###
if [ 条件判断式 ]
then
	执行程序
fi

多分支:

if [ 条件判断式 ]
then
	执行程序
elif [ 条件判断式 ]
then
	执行程序
else
	执行程序
fi

注意:

  • [ 条件判断式 ],中括号与条件判断式之间必须有空格
  • if后要有空格

例:

[vvvcxjvvv@localhost shell_scripts]$ cat if_test.sh
#!/bin/bash/
if [ $1 -lt 0 ]
then
	echo "less than 0"
elif [ $1 -eq 0 ]
then
	echo "equal to 0"
else 
	echo "more than 0"
fi
[vvvcxjvvv@localhost shell_scripts]$ sh ./if_test.sh 23
more than 0
[vvvcxjvvv@localhost shell_scripts]$ 

4.2 case语句

语法:

case $变量名 in
"值1")
	执行语句1
;;
"值2")
	执行语句2
;;
...省略其它分支...
;;
*)
	如果变量的值不是以上的值,执行默认语句
;;
esac

注意:

  • case行尾部必须为单词in,每一个模式匹配以右括号)jieshu
  • 双分号;;表示命令序列结束
  • *)表示默认模式,相当于default

例:

[vvvcxjvvv@localhost shell_scripts]$ cat case_test.sh
#!/bin/bash/
case $1 in
"Monica")
	echo "She is my friend!"
;;
"Chandler")
	echo "He is my friend!"
;;
"Phoebe")
	echo "She is my friend!"
;;
"Joey")
	echo "He is my friend!"
;;
"Ross")
	echo "He is my friend!"
;;
"Rachel")
	echo "She is my friend!"
;;
*)
	echo "You are not my friend..."
;;
esac
[vvvcxjvvv@localhost shell_scripts]$ sh ./case_test.sh Chandler
He is my friend!
[vvvcxjvvv@localhost shell_scripts]$ sh ./case_test.sh Alan
You are not my friend...
[vvvcxjvvv@localhost shell_scripts]$ 

4.3 for循环

语法:

####语法1###
for ((初始值;循环控制条件;变量变化;))
do
	执行程序
done
####语法2###
for 变量 in 值1 值2 值3...
do
	执行程序
done 

例:

[vvvcxjvvv@localhost shell_scripts]$ cat ./for_test1.sh
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do 
	sum=$[$sum+$i]
done
echo $sum
[vvvcxjvvv@localhost shell_scripts]$ sh ./for_test1.sh
5050
[vvvcxjvvv@localhost shell_scripts]$ cat ./for_test2.sh
#!/bin/bash/
for friend in Monica Chandler Phoebe Joey Ross Rachel
do
	echo "Hello $friend"
done
[vvvcxjvvv@localhost shell_scripts]$ sh ./for_test2.sh
Hello Monica
Hello Chandler
Hello Phoebe
Hello Joey
Hello Ross
Hello Rachel
[vvvcxjvvv@localhost shell_scripts]$ 

4.4 while循环

语法:

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

例:

[vvvcxjvvv@localhost shell_scripts]$ cat while_test.sh
#!/bin/bash
sum=0
i=0
while [ $i -le 100 ]
do
	sum=$[$sum+$i]
	i=$[$i+1]
done
echo $sum
[vvvcxjvvv@localhost shell_scripts]$ sh while_test.sh
5050

五、自定义函数

语法:

[ function ] funname[()]
{
	Action;
	[return int;]
}

注意:

  • shell脚本是逐行执行,所有函数声明必须在调用之前
  • 函数的返回值只能通过$?获得,可以显示加return返回;如果不加return,将以最后一条命令的运行结果作为返回值。return后跟数值0-255;

例:

[vvvcxjvvv@localhost shell_scripts]$ cat add.sh
#!/bin/bash
function add()
{
    s=0
    s=$[$1+$2]
    echo "$s"	

}

read -p "Enter the first number: " n1
read -p "Enter the second number: " n2

add $n1 $n2

[vvvcxjvvv@localhost shell_scripts]$ sh ./add.sh
Enter the first number: 1
Enter the second number: 2
3
[vvvcxjvvv@localhost shell_scripts]$ 

总结

本文整理了一些shell脚本学习过程中的知识点,包含shell脚本的格式与执行、变量的使用、条件判断式、流程控制语句(if、case、for、while)以及如何自定义函数。

参考资料

《鸟哥的Linux私房菜》

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值