文章目录
shell 编程基础第一个脚本变量运算符流程控制语句三元运算符read:人机交互界面,程序中用来获取用户手动输入的值shell的自定义函数
shell 编程基础
第一个脚本
打印helloworld
vi hw.sh
-------------------------
#! /bin/bash
echo helloworld
-------------------------
#! /bin/bash : 代表使用哪种解析器来解析脚本文件
执行方式
1)source 或者. 空格 文件名--将脚本程序拉取到当前进程空间执行
2)bash + 脚本文件名--脚本程序在当前进程的子进程执行
3)给脚本赋予可执行权限,进行执行--脚本程序在当前进程的子进程执行
变量
变量分类 :
1.系统变量
2.自定义变量
3.只读变量 : readonly 变量,一旦声明,变量不能更改,不能撤销
注意:定义变量的时候不能有空格
查看变量 :
set : 查看所有变量
A = 25 : 查看单个变量
使用变量 :
A = 'helloWord'
set
echo "$As is strong" # 无法输出变量A ,查找的是AS这个变量
echo "$A is strong"
echo "${A} is strong" # 将A单独作为一个整体
echo '${A} is strong' #单引号会将变量脱意,双引号仅将空格脱意
撤销变量 : unset 变量
1.unset A
2.不能撤销只读变量
程序的执行空间
vi a.sh
--------------------
#! /bin/bash
a="a is in a.sh "
--------------------
echo $a
vi b.sh
--------------------
#! /bin/bash
b="b is in b.sh "
echo $b
echo $a
--------------------
修改a.sh,使用export变量提升a为全局变量,也就是a.sh的子进程都能访问a
vi a.sh
--------------------
#! /bin/bash
export="a is in a.sh "
echo $a
/root/shells/b.sh
--------------------
echo $a
vi b.sh
--------------------
#! /bin/bash
b="b is in b.sh "
echo $b
echo $a
--------------------
总结:
1.a.sh总直接调用b.sh,会让b.sh在a.sh的进程空间创建一个子进程创建一个空间去执行
2.子空间中只能访问父空间中用export提升过的变量
3.一个shell进程无法将自己定义的变量提升到父进程空间中
4.source 或者 "." 空格执行脚本时,或让脚本在调用者所在的进程空间执行
变量赋值:
实例:把ls取出的内容赋值给一个变量,执行一个 或脚本,将执行结果赋值给变量.执行结果,执行之前不确定,无法赋值,我们就使用反引号赋值
反引号赋值
B=`ls -l`
C=`date`
d=$(ls -l) 与反引号赋值效果一样
特殊变量:
$? : 表示上一个命令返回的状态 (0-255),不同的错误返回的状态码不一样,返回0代表成功
$$ : 表示当前的进程编号
$0 : 表示当前脚本名称
$n : 表示第n个参数(执行脚本有可能从外面获取参数 touch 1.txt 2.txt)
vi a.sh
--------------------
#! /bin/bash
export="a is in a.sh "
echo $a
echo $0
echo $$
echo $1
echo $10
echo ${10}
/root/shells/b.sh
--------------------
echo $a
vi b.sh
--------------------
#! /bin/bash
b="b is in b.sh "
echo $0
echo $$
echo $b
echo $a
--------------------
当n为0时输出脚本名称,n>9的时候,要使用{}括起来,例如like ${10}
$# : 表示参数的个数,常用语循环
vi e.sh
-------------------
#! /bin/bash
echo $#
echo $1
--------------------
bash e.sh 1 2 3 4 6
输出结果:
-------------
5
1
----------------
$@ : 参数列表
$* : 参数列表 ,当用双引号括起来时,$@和$*是有区别的,$"@"会将各个参数分开.$"*"将所有参数当做一个整体
不加双引号时
vi e.sh
-------------------
#! /bin/bash
echo $#
echo $1
echo $@
echo $*
--------------------
bash e.sh 1 2 3 4 6
输出结果:
-------------
5
1
1 2 3 4 6
1 2 3 4 6
----------------
*************************
1)使用$@
vi f.sh
-------------------
#! /bin/bash
for i in "$@"
do
echo $i
done
echo "finsh"
--------------------
bash e.sh 1 2 3 4 5
输出结果:
-------------
1
2
3
4
5
finsh
----------------
2)使用$*
vi f.sh
-------------------
#! /bin/bash
for i in "$*"
do
echo $i
done
echo "finsh"
--------------------
bash e.sh 1 2 3 4 5
输出结果:
-------------
1 2 3 4 5
finsh
----------------
运算符
1.使用expr
格式 : expt + m + n 或者使用$(m+n)
注意 : expt中间必须有空格
练习 : 计算(2+3)*4
方法一:分步
step1:s=`expt 2 + 3`
step2:s=`expt $s \* 4`
------->
s=`expr \`expr 2 + 3\` \* 4`
echo $s
输出结果:
------------------
20
------------------
方法二:用()
------->
当需要取得计算结果时,需要用$引用
s=$(((2+3)*4))
echo $s
输出结果:
------------------
20
------------------
2.使用let
i=1
let i++
let i=i+2
echo $i
3.判断运算符
基本运算符
= : 等于,相当于java中的==
!= : 不等于
-z : 表示判断字符长度是否为0,为0则返回true
-n : 表示判断字符长度是否为0,不为0则返回true
整数比较:
-lt : 小于
-le : 小于等于
-gt : 大于
-ge : 大于等于
-eq : 等于
-ne : 不等于
\> \>= \< \<= =
文件比较:
-r : 读权限
-w : 写权限
-x : 执行权限
-f : 文件存在并且是一个常规文件
-s : 文件存在且不为空
-e : 判断文件是否存在
-d : 判断是否为目录
-b : 文件存在,并且是一个设备
-L : 判断是否是一个连接
流程控制语句
1.分支
1)基本结构化命令 if-then语句格式
if [ condition ]
then
command
command
...
fi
----------->
year=1979
if [ $year -eq 1979 ]
then
echo "$year年"
let year--
echo "$year年"
fi
运行结果:
------------
1979年
1978年
------------
2)基本结构化命令 if-then-else语句格式
if [ condition ]
then
command
command
...
else
command
command
...
fi
----------->
year=1979;if [ $year -lt 1979 ];then echo "$year年"; else echo "$year年 is new"; fi
运行结果:
-----------
1978年
-----------
3)嵌套if
if [ condition ]
then
command
command
...
elif [ condition ]
command
command
...
else
command
command
...
fi
if [ $year -eq 1979 ]; then echo "$year年 老人画了个圈";
elif [ $year -gt 1979 ] ; then echo "$year年 is new"; else echo "$year年"; fi
4)条件判断基本控制语法注意点:
condition前后必须由空格,非空返回true,可以使用$?,内部的=前后要有空格,否则结果有区别
if [ a=b ];then echo "ok";else echo "nook" ;fi ##b赋值给a
if [ a = b ];then echo "ok";else echo "nook" ;fi ##相当于 == 做判断
2.while循环
格式:
while [ expression ]
do
command
done
实例:
vi shile.sh
------------------------
#!/bin/bash
read -p "请输入一个数字:" num
while [ $num -lt 10 ]
do
echo "$num"
let num++
done
------------------------
vi while.sh
------------------------
#!/bin/bash
read -p "请输入一个数字:" num
while((num<=5))
do
echo "$num"
let num++
done
----------------------
case语句:
case 值 in
模式1)
command
command
...
模式2)
command
command
...
esac
实例:
vi case.sh
------------------------
#!/bin/bash
while true(这里直接写冒号也代表死循环)
do
read -p "请输入一个1-5之间的数字" num
case $num in
1|2|3)
echo "您输入的数字是$num"
break
;;
4|5)
echo "您输入的数字是$num"
break
;;
*)
echo "您输入的数字是$num"
continue
esac
done
---------------------------
3.for循环
第一种写法
for i in 1 2 3 4
do
echo $i
done
第二种写法
for((i=0;i <= 5;i++))
do
echo "$i"
done
三元运算符
格式:[ condition ] && echo "ok" || echo "nook"
condition ? 0 : 1
当条件满足时,执行&&后面的语句
当条件不满足时,执行||后面的语句
条件判断组合
[] -a -o 一起使用
[[]] && || 一起使用
练习:
if [ a = b -a b = c ];then echo "ok";else echo "nook"; fi
结果:
------------
nook
------------
read:人机交互界面,程序中用来获取用户手动输入的值
实例:
vi read.sh
--------------
#! /bin/bash
echo "姓名:"
read value
echo $value
--------------
vi read.sh
--------------
#! /bin/bash
read -p "姓名:" name
echo $name
--------------
注意:
-p 提示语句不换行
-n 限定等待时间
-t 限制等待时间
shell的自定义函数
格式:
[function] 函数名称()
{
action;
[return int;] ##0-255
}
实例:
vi funtion.sh*******不带返回值,直接打印
--------------------------------
#!/bin/bash
param1=$1
param2=$2
function sum()
{
returnValue=$((param1+param2))
echo $returnValue
}
sum param1 param2
--------------------------------
vi function2.sh*******带返回值
--------------------------------
#!/bin/bash
param1=$1
param2=$2
function sum()
{
returnValue=$((param1+param2))
return $returnValue
}
sum param1 param2
echo "$?"
-----------------------------------
注意:
1.参数的返回可以显示加:return返回,返回的是0-155之间的数
2.如果不加return,函数将以最后一条命令结果作为返回值
3.shell中通过return返回是有限制的,最大值是255,超过255从0开始