Linux-shell编程

shell 基础语法

1.第一个程序(无限循环)

大概显示shell的用法

#!/bin/bash		## 使用bash运行
while true		## while循环
do				## 开启代码块
echo "this is shell while"		
date
sleep 0.5		## 暂停运行0.5秒
done			## 结束代码块

2.系统变量

例如:pwd是一个系统变量,随着用户所在目录的变化而变化

临时变量
//设置一个临时变量(用户本进程)
name=value
# 等号两边不能有空格
unset name		# 清除变量
readonly name1	# 定义的‘常量’不能改变,也unset
全局变量
export name2=2	# 定义全局变量,

如果有个程序a.sh

#!/bin/bash
a=aaa
echo "a in a.sh is --"$a
bash b.sh

另一个程序b.sh

#!/bin/bash
a=aaa
echo "a in b.sh is --"$a

结果是

a in a.sh is --aaa
a in a.sh is --

可以看出在一个进程中定义的变量不能被另一个进程使用

如果要让它能使用,有3个方式修改a.sh第四行

  1. 可在定义变量时使用export
  2. 使用source,让子进程也能使用变量
  3. 使用. ./b.sh 用点可以代替source

3.数学运算

一、用expr

expr `expr 2 + 3` \* 4			# *号需要转义
echo `expr \`expr 2 + 3\` \* 4`	# `号和*号都转义了
# 20
# 20

二、用 (())

a=((1+2))
b=(((2+3)*4))
c=$((1+2))
count=1
((count++))
echo "a=${a}b=${b}c=${c}count=${count}"
# a=3b=20c=3count=2

三、用$[]

a=$[1+2]
echo $a
# 3

4. 流程控制

一、从控制台读取输入数据

read -p "请输入一个值:" value
# 请输入一个值:abc
echo $value
# abc

二、if语法(条件表达式)

ifelif用于判断,后面加上[]下一行为then,然后是判断成功的代码块。
[ ]也是一个命令 命令之间用空格相隔
if语句结束后用fi表示if语句结束

read -p "输入你的名字:" name
if [ $name = root ]
then
echo "hello root, welcome!"
elif [ $name = admin ]
then
echo "hello,you is admin"
else
echo "sorry,you not's master"
fi
短路(理解为三元运算)

条件满足为OK,不满足为NOT-OK

[ condition ] && echo OK || echo NOT-OK

例如:

[root@localhost ~]# [ 1 = 1 ] && echo OK || echo NOT-OK
OK
[root@localhost ~]# [ 1 = 2 ] && echo OK || echo NOT-OK
NOT-OK
条件组合

[ ] 与 [[ ]] 中逻辑组合可以使用 && || 符号,而 [ ] 里面逻辑组合用 -a -o 表示

在[]中用-a表示&&,用-o表示||	
[root@localhost ~]# if [ 1 = 1 -a 2 = 2 ];then echo ok;else echo notok;fi
ok
[root@localhost ~]# if [ 1 = 1 -a 2 = 1 ];then echo ok;else echo notok;fi
notok
------------------对比线--------------------
[root@localhost ~]# if [[ 1 = 1 || 2 = 1 ]];then echo ok;else echo notok;fi
ok
[root@localhost ~]# if [[ 1 = 1 && 2 = 1 ]];then echo ok;else echo notok;fi
notok
字符串比较:
符号 解释
= 字符串是否相同
!= 字符串是否不相同
-z 字符串长度是为0返回true
-n 字符串长度是不为0 返回true
整数比较:
符号 解释
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
文件判断:
符号 解释
-d 判断时候为目录
-f 是否为文件
-e 是否存在

三、while语法

可参考上面if的流程和本文开头的第一个程序来理解while语法

5.函数

一、定义

#!/bin/basn
## 函数定义
hello()
{
echo "hello there today's `date +%Y-%m-%d`"
return 2		## 返回值是状态码,只能在[0-255]内
}

## 下面是函数的简单调用
echo "函数开始!!!"
hello
echo $?			## 获取上一个命令的返回值
echo "函数结束!!!"

二、调用

## 用function hello()
## 或function hello
## 或hello

三、传参数

#!/bin/bash
fun()
{
echo "第一个参数 $1 !"
echo "第五个参数 $5 !"
echo "第十个参数 $10 !"	# 获取不到$10 只能用${10}
echo "第十个参数 ${10} !"
echo "共 $# 个参数!"
echo "作为一个字符串输出所有参数 $* !"
}
fun 1 2 3 4 5 6 7 8 9 0

# [root@localhost ~]# bash c.sh 
# 第一个参数 1 !
# 第五个参数 5 !
# 第十个参数 10 !
# 第十个参数 0 !
# 共 10 个参数!
# 作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 0 !

四、跨脚本调用

先一个脚本a.sh

#!/bin/bash
fun()
{
echo "第一个参数 $1 !"
echo "第五个参数 $5 !"
echo "第十个参数 $10 !"	# 获取不到$10 只能用${10}
echo "第十个参数 ${10} !"
echo "共 $# 个参数!"
echo "作为一个字符串输出所有参数 $* !"
}
fun 1 2 3 4 5 6 7 8 9 0

再来一个脚本b.sh

#!/bin/bash
source ./a.sh
# 或者是. ./a.sh  注意:两个点中间有空格
fun 1 2 3 4 5 6 7 8 9 0
# [root@localhost ~]# bash b.sh 
# 第一个参数 1 !
# 第五个参数 5 !
# 第十个参数 10 !
# 第十个参数 0 !
# 共 10 个参数!
# 作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 0 !

posted on 2021-06-27 01:46  83-46  阅读(52)  评论(0)    收藏  举报