第一个脚本程序
- shell脚本文件使用.sh作为文件后缀;
- 在脚本文件中的第1行使用#!指明shell解释器;
- 对于脚本文件的注释,使用#单行注释;
- 在运行脚本文件之前,需要使用chmod +x 脚本文件名称,来给脚本文件添加可执行权限,然后才能够运行。
#! /bin/bash # 指定shell解释器/bin/sh /bin/dash /bin/bash /bin/rbash
echo "hello shell" # shell语句块
shell语言
变量
自定义变量
1.基本使用语法
语法格式:
变量名称=变量初始值
变量的访问使用$访问
#! /bin/bash #指定shell解释器
num="hello shell" # 定义变量num,并设置初始值为"hello shell"
echo $num # 访问变量的值
2.特殊使用
a.键盘输入
语法格式
read 变量名
#! /bin/bash #指定shell解释器
read value # read value 从键盘读取数据存储到变量value中
echo $value # 访问变量的值
b.引号问题
#! /bin/bash #指定shell解释器
num="hello shell" # 将整个字符串的内容赋值给变量num
echo $num
num=hello123 # 将字符串hello123赋值给变量num
echo $num
num='hello shell' # 将整个字符串的内容赋值给变量num
echo $num
c.只读变量
在定义变量的时候,使用readonly修饰。该变量只能在第一次定义的时候设置初始值,后序过程中只能访问,不能在次修改。
d.对于变量如果使用export修饰,则导出为环境变量,在其它的shell脚本中可以访问。引用环境变量
环境变量
所谓的环境变量,指的是系统能够正常运行所需要使用的环境信息参数,通过变量实现存储,则称为环境变量。
常用的环境变量:
HOME 用于保存注册目录的完全路径名,用户家(主)目录。
PATH 可执行程序的路径
LD_LIBRARY_PATH 依赖库路径。
常用的环境命令:
env 输出所有环境变量的信息;
export 设置环境变量的值;
unset 清除环境变量
环境变量的访问:和自定义变量一样,$环境变量名称
预设变量
运行命令:./test.sh aaa bbb ccc ddd eee fff hhh 888 999 0000 1212121
#! /bin/bash
echo $# # 统计脚本运行时候,所传递参数的个数11.
echo $* # 所有参数内容
# 后面表示依次得到对应序号的参数内容,注意如果序号大于9则需要使用{}包含
echo $1 # 得到序号1的参数内容 aaa
echo $2 # bbb
echo $3 # ccc
echo $4 # ddd
echo $5 # eee
echo $6 # fff
echo $7 # hhh
echo $8 # 888
echo $9 # 999
echo ${10} # 得到序号10的参数内容 0000
echo ${11} # 得到序号11的参数内容 1212121
echo $? # 得到上一条指令运行的状态
echo $$ # 当前进程号 可以使用ps命令查看
echo $0 # 当前进程名称
变量的特殊使用
1.双引号
直接解析变量为内容本身
#! /bin/bash #指定shell解释器
name=阿斯巴甜
echo "你的名字是$name" #你的名字是阿斯巴甜
2.单引号''
直接解析变量为字符串
#! /bin/bash #指定shell解释器
name=阿斯巴甜
echo '你的名字是$name' #你的名字是$name
3.反撇号`(注意在数字1的左侧按键)
一般会嵌套到双引号中,此时反撇号中的内容为系统命令
#! /bin/bash #指定shell解释器
echo "当前时间为`date +%F`" #当前时间为2022-09-24
4.-e 转义字符
对于转义字符需要使用-e来说明,否则直接解释为字符串
#! /bin/bash #指定shell解释器
echo "I want play a \n game with you" #I want play a \n game with you
echo -e "I want play a \n game with you" << EOF
I want play a
game with you
EOF
5.圆括号的使用
#! /bin/bash #指定shell解释器
name=阿斯巴甜
( name=巴斯光年; echo $name ) # 此时圆括号内容,局部范围内修改变量name的值,当()结束还原为括号开始的初始值
echo $name # 输出的是阿斯巴甜
6.花括号的使用{}
#! /bin/bash #指定shell解释器
name=阿斯巴甜
{ name=巴斯光年; echo $name; } # 此时name访问会修改name的值,即使{}结束,其值不会在还原。{}开始和结束需要使用空格
echo $name # 输出的是巴斯光年
语句
测试语句
测速语句也称为条件测速语句,主要用文件类型测试、字符串测试、数字测试、复合测试语句
测试语句的两种语法格式:
- test condition
- [ condition ] 注意:在方括号做测试语句的时候,条件的两边需要使用空格。
文件测试语句
测试文件状态的条件表达式
-e #是否存在
-d #是目录
-f #是文件
-r #可读 -w 可写 -x 可执行
-L #符号连接
-c #是否字符设备
-b #是否块设备
-s #文件非空
#! /bin/bash
file=test.sh
test -f $file # 测试变量file的内容是否为文件
echo $? # 得到上一条指令运行的状态
[ -f $file ] # 测试变量file的内容是否为文件
echo $? # 得到上一条指令运行的状态
字符串测试语句
测试字符串的条件:
>、<、==、!=
-n 测试是否为非空串
-z 测试是否为空串
#! /bin/bash #指定shell解释器
str1="阿斯巴甜"
str2="巴斯光年"
test str1 > str2 #测试str1是否大于str2
echo $?
test str1 != str2 #测试str1是否不等于str2
echo $?
[ str1 == str2 ] #测试str1是否等于str2
echo $?
[ -n str1 ] #测试str1是否为非空串
echo $?
[ -z str2 ]
echo $? #测试str2是否为空串
数字测试语句
对于数字测试语句可以使用test 条件表达式,也可使用[ 条件表达式 ],在条件表达式中可以使用如下运算符实现
英文单词 | shell比较符 | |
---|---|---|
相等 | equal | -eq |
不相等 | not equal | -ne |
大于 | greater than | -gt |
大于等于 | greater equal | -ge |
小于等于 | less equal | -le |
小于 | less than | -lt |
#! /bin/bash
num1=12
num2=23
test $num1 -eq $num2 #测试num1的值是否等于num2
echo $?
[ $num1 -eq $num2 ] #测试num1的值是否等于num2
echo $?
test $num1 -lt $num2 #测试num1的值是否小于num2
echo $?
复合测试语句
-a | (and)两状况同时成立 test -r file -a -x file file同时具有r于x权限 |
---|---|
-o | (or)两状况任何一个成立 test -r file -o -x file file 具有r或x权限 |
! | 相反状态 test ! -x file 当file不具有x时 |
#! /bin/bash
num1=9527
test $num1 -lt 30 -a $num1 -gt 10 #测试num1的值是否小于30,并且大于10
echo $?
控制语句
if条件语句
if控制语句
if [ 条件表达式 ];then # 条件表达式也可以使用 test 语句来实现
执行语句块
else
执行语句块
fi # 以fi作为结束标志
1.条件执行实行
#! /bin/bash
if test 1 -eq 1 ; then # 条件判断执行,then起始执行
echo "1 等于 1"
fi
2.条件分支执行实例
#! /bin/bash
if test 1 -eq 2; then # 条件表达式,成立执行then后面的语句,否则不成立执行else后面的语句
echo "1 等于 2"
else
echo "1 不等于 2"
fi
3.条件嵌套
#! /bin/bash
if test 1 -eq 2; then
else
# 条件判断语句的嵌套
if [ 2 -eq 3 ]; then
echo "2 等于 3"
else
echo "2 不等于 3"
fi
fi
嵌套的优化处理
#! /bin/bash
file = test.sh
if test -d $file; then
echo $file is dir
elif [ -f $file ]; then # 实现嵌套的优化,等价于 else if (条件)
echo $file is file
elif [ -b $file ]; then
echo $file is blockdiv
else
echo $file is other
fi
case条件控制语句
#! /bin/bash
case $1 in
"1")
echo 1
;; # 以;;结束,并且每一个条件都需要使用;;结束
"2"
echo 2
;;
*)
echo other
;;
esac
for控制语句
c语言形式
#! /bin/bash
sum=0
for (( i=0; i <= 100; i++ )) do # 循环的括号是双层,
sum=`expr $sum + $i` # expr 实现算术运算,将$sum转化为整数和$i转换的整数相加;
done
echo $sum
for in形式
#! /bin/bash
for value in 1 2 3 4 5 6 7 8 9 10
do # 注意对于do必须单独起行,否则会当作初始化表中的数据访问
echo $value
done
while控制语句
#! /bin/bash
i=0
sum=0
while [ $i -lt 100 ] # 条件成立进入while循环体执行,否则退出整个循环
do # do需要单独写出,不能直接放在条件语句后面
sum=`expr $sum + $i`
i=`expr $i + 1`
done
echo $sum
until控制语句
#! /bin/bash
i=0
sum=0
until [ $i -gt 100 ] # 条件不成立成立进入until循环体执行,否则条件成立退出整个循环
do
sum=`expr $sum + $i`
done
echo $sum
break continue控制语句
break continue控制语句
break break命令允许跳出循环。 break 通常在进行一些处理后退出循环或case 语句
continue 命令类似于break 命令 只有一点重要差别,它不会跳出循环,只是跳过这个循环步
#! /bin/bash
i=0
sum=0
until [ $i -gt 100 ]
do
if [ $i -eq 50 ]; then
i=`expr $i + 1`
break # break跳出整个循环体
fi
if [ $i -eq 5 ]; then
i=`expr $i + 1`
continue # continue 结束本次循环进入下一次循环
fi
sum=`expr $sum + $i`
i=`expr $i + 1`
done
函数
#! /bin/bash
# 函数定义的方式一
myTest(){
echo "func test"
}
# 方式二
function myFunc(){
echo "function test"
}
# 参数可以使用预设变量传递参数
file_or_dir(){
echo $1 #使用预设变量接收传递的参数
if [ -f $1 ]; then
echo $1 is file
return 1
elif [ -d $1 ]; then
echo $1 is dir
return 2
fi
return 0 #函数中可以有返回值
}
read myfile
ls $myfile
myTest
myFunc
file_or_dir $myfile #函数调用并传递参数
err=$? #接收函数的返回值
if [ $err -eq 1 ]; then
cat $myfile
elif [ $err -eq 2]; then
ls $myfile
fi
网友评论