Linux基础(第四章)Shell编程基础

脚本

Linux系统中脚本大多以sh为后缀名,基于bash文件运行,bash相当于是sh文件的编译器。在编写sh文件时,应在头部写上#!/bin/bash

变量

本地变量

即在当前的脚本或环境中可以调用的变量。
定义本地变量和调用:

name=hwq #定义
echo ${name} #调用 

echo不仅可以向文件插入内容,也可以用来调用变量,结果类似于java中的System.out.println()或python中的print()
访问变量都需要在变量前加上$,但是一些特殊的变量需要加上${}才可以访问,如数组,所以就统一所有变量都使用${}访问。

用户变量

即在使用定义变量的用户时可以访问的变量。管理用户变量的文件是用户主目录下的.bash_profile文件,需要使用ls -a才能看到
创建用户变量:

cd #返回用户住目录
vi .bash_profile

进入.bash_profile的编辑模式,插入语句export NAME_TEST=hwq,一般来说除了本地变量,其他的变量最好都用全大写的形式。
在这里插入图片描述
完成修改后,:wq保存修改并source .bash_profile。之后,便能在当前用户访问NAME_TEST这个变量了,但如果切换用户就不能访问了。

环境变量

环境变量又称全局变量,可以在当前系统中被访问。如jdk的环境变量JAVA_HOME,便是如此。定义环境变量需要在/etc/profile中。

位置参量

概念:主要是向脚本中传递数据,变量名不能自定义,变量作用是固定的。

位置参量用途
$nn表示整数,即第几个传入的参数,当n>=10,需要写成如${10}、${12}的形式
$*将接收所有的参数拼接成一个字符串,字符串的分隔符以脚本中分割变量的分隔符为准
$@代表命令行的 所有参数代表一个整体,不过把每个参数区分对待
$?上条命令执行是否成功,0代表成功,其他任意数字都代表失败
$!后台运行的最后一条命令的进程号
$$当前运行命令的进程号
$0运行该脚本的方式

示例
脚本:

#!/bin/bash

echo "Hello $1 $2 $3!!!"

echo $0

echo $#

echo $*

echo $!

echo $?

测试结果:
在这里插入图片描述

脚本运行语句

./test.sh
. test.sh
sh test.sh 

上面3条语句均可运行脚本,常用. test.sh这种方式

脚本中使用date命令

date +%Y-%m-%d,可指定日期按“年-月-日”的格式输出,更多的设置可以查看date命令的帮助
示例
脚本:

#!/bin/bash

date1=$(date +%Y-%m-%d)
echo "今天是${date1}"
date2=$(date --date='2 days ago' +%Y-%m-%d) # --date='n days ago'是date命令的扩展用法
echo "两天前是${date2}"
date3=$(date --date='-2 days ago' +%Y-%m-%d)
echo "两天后是${date3}"

测试结果:
在这里插入图片描述
值得注意的是,在调用系统命令来生成变量是使用的是$()
当一个变量以"$[变量名]"的形式调用时,实际不只调用了这个变量而且将结果转为字符串来输出,同时可以在""中加入更多内容来达到字符串拼接或格式化输出的目的。

if判断

格式

if [条件1] then
something #执行语句
elif [条件2] then
something #执行语句
else
something #执行语句
fi #终结if语句,必须要有fi

elif和else均非必须,但是if…if是必须的。

if判断参数

字符串判断:

str1 = str2     当两个串有相同内容、长度时为真
str1 != str2     当串str1和str2不等时为真
-n str1       当串的长度大于0时为真(串非空)
-z str1       当串的长度为0时为真(空串)
str1        当串str1为非空时为真

数字判断:

int1 -eq int2   两数相等为真 
int1 -ne int2   两数不等为真 
int1 -gt int2   int1大于int2为真 
int1 -ge int2   int1大于等于int2为真 
int1 -lt int2   int1小于int2为真 
int1 -le int2   int1小于等于int2为真

文件相关的判断:

-b          当file存在并且是块文件时返回真     
-c          当file存在并且是字符文件时返回真  
-d          当pathname存在并且是一个目录时返回真     
-e          当pathname指定的文件或目录存在时返回真  
-f          当file存在并且是正规文件时返回真     
-g          当由pathname指定的文件或目录存在并且设置了SGID位时返回为真  
-h          当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效  
-k          当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真     
-p          当file存在并且是命令管道时返回为真  
-r          当由pathname指定的文件或目录存在并且可读时返回为真     
-s          当file存在文件大小大于0时返回真  
-u          当由pathname指定的文件或目录存在并且设置了SUID位时返回真  
-w          当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。  
-o          当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。

逻辑运算符:

-a        与
-o        或
!        非

示例

#!/bin/bash
SYSTEM="$(uname -s)" # 获取操作系统类型
if [ $SYSTEM = "Linux" ] ; then 
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi

for循环

示例:

#!/bin/bash

for var in 1 2 3 4 5
do
	echo $var
done #done表示循环体终止

echo "-------------------"
num=10
sum=0
for((i=0;i<$num;i=i+1))
do
	sum=$(($sum+$i)) #如果直接写为$sum+$i的形式,结果将会是字符串拼接
done
echo $sum

echo "--------------------" 
arr=(1 2 3 4 5 6) #遍历数组
for i in $(seq 0 ${#arr[@]}) #${#arr[@]}可以获取数组的长度
do
	echo ${arr[$i]}
done

测试结果:

在这里插入图片描述

while循环

while循环配合cat命令实现打印文件内容

代码:

#!/bin/bash
site_file=$1

if [ -f "${site_file}" ];then
cat ${site_file} | while read line
do
	echo ${line}
done
else
	echo "没有这个文件"
fi

测试结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值