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第四行
- 可在定义变量时使用
export - 使用
source,让子进程也能使用变量 - 使用
. ./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语法(条件表达式)
if 和elif用于判断,后面加上[]下一行为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 !
浙公网安备 33010602011771号