目录
1shell的基础概念:
1.1概念
shell的使用方式:手动命令和脚本
shell脚本的本质:shell命令的有序集合,扩展名可以为.sh,也可以没有
shell不仅是一个应用程序还是一种脚本语言
1)编译型语言:c ,java ,c++ ,当中间出错,err直接结束,修改重新编译运行
2)解释型语言:shell python,不需要编译直接执行,当中间出粗偶,智慧在错误的地方报错,但是不会影响后面的内容;解析一条指令,执行一条指令
1.2创建和执行
创建shell脚本:
touch test.sh
第一行写:#!/bin/bash
解释性信息,意思是使用/bin/bash来解释执行
执行方式:
1.chmod 777 test.sh :是脚本具有执行权限
./test.sh
2.sh test.sh (不要用,应急shell)
例如:
#!/bin/bash
touch file34.c
练习:
1)在上级目录下创建file1.c file2.c 两个文件
2)将该两个文件移动到家目录
3)将两个文件用tar压缩成gz的格式
#!/bin/bash
cd ..
touch file1.c file2.c
mv file1.c file2.c ~
cd
tar -czf file.tar.gz file1.c file2.c
2变量
2.1用户自定义变量
一般用大写
进行赋值用=,左右两边不能有空格
引用变量前面加$
2.2位置变量
$0,与输入的命令行一样,包含脚本名字 xx.sh
$1 , $2 .... $9 :分别包含第一个到第九个命令行参数
$#:命令行参数的个数,不包含脚本文件
$@:所有命令行参数
$*:所有命令行参数
2.3预定义变量
$?前一个命令的退出状态(0为真,非零为假)
$$正在运行进程的ID号
2.4环境变量
变量没有类型
环境变量一般指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置、系统文件位置等
HOME /etc/passwd文件中列出的用户的主目录
PATH shell搜索路径,一系列的目录
3功能语句
3.1说明性语句
以#开头
注释用#
3.2功能性语句
1)read
功能:read从标准输入读入一行,并赋值给后面的变量
格式: read VAR1 VAR2 VAR3
读入行的第一个单词赋值给var1 ,第二个单词赋值给var2,..其余所有都赋值给最后一个变量
read -p "提示语句" 变量名 : 可以将提示语句输出,同时输入变量
2)expr
格式:expr 表达式
算术运算符命令expr主要用于简单的整数运算, 加(+),减(-)乘( \*) 除 (/)取余 (%)
例:
expr 12 + 5 \* 3
注意:
1)表达式符号之间必须用空格间隔
2)expr引用变量必须$
3)expr自带打印功能
4)使用乘号\* 小括号\( \) 需要转义
- 把expr的结果赋值给变量需要命令置换符
- expr不能进行++ -- 操作
#!/bin/bash
VAR=5
NUM=`expr \( 2 + $VAR \) \* 4`
# ((NUM++))
echo $NUM
练习2:通过expr实现变量自加运算
#!/bin/bash
NUM=5
NUM=`expr $NUM + 1`
echo $NUM #6
练习2:计算表达式值a*b+c-d/b,a=2,b=3,c=15,d=18
要求:
1)从终端读入4个数a,b,c,d
2)进行运算
3)打印结果输出到终端
3)let
let 表达式
- 运算的时候运算符左右两边不能有空格
- 不能自己打印,输出需要用echo
- let语句可以不加$引用变量
- let n=n**2 表示平方
- 可以++ -- ,()转义,*不转义
4)test
可以测试三种对象:字符串 整数 文件属性
1.字符串测试
s1 = s2 测试两个字符串是否完全一样
s1 != s2 测试两个字符串是否有差异
-z s1 测试s1长度是否为0
-n s1 测试s1长度是否不为0
2.整数的测试
$a -eq $b 测试a与b是否相等 equal
$a -ne $b 测试a与b是否不相等 not equal
$a -gt $b 测试a是否大于b greater than
$a -ge $b 测试a是否大于等于b
$a -lt $b 测试a是否小于b less than
$a -le $b 测试a是否小于等于b
#!/bin/bash
NUM=10
test $NUM -eq 1
echo $? #1
test $NUM -ne 10
echo $?#1
test $NUM -lt 15
echo $?#0
3.文件属性测试
测试name 是否为一个目录 -d name
测试name 是否为一个普通文件 -f name
测试name 是否存在 -e name
4结构性语句
4.1if语句
1)基本结构
if 条件
then
命令表1
else
命令表2
fi
#!/bin/bash
read NUM
if test $NUM -eq 10
then
echo "=10"
else
echo "!=10"
fi
2)分层结构
if 条件1
then
命令表1
elift 条件2
then
命令表2
else
命令表3
fi
#!/bin/bash
read NUM
if test $NUM -eq 10
then
echo "=10"
elif test $NUM -gt 10
then
echo ">10"
else
echo "<10"
fi
3)嵌套结构
if 条件
then
if 条件
then
命令表1
else
命令表2
fi
else
命令表2
fi
4)判断语句其他格式
if [ 条件 ];
then
命令表1
else
命令表2
fi
注意:
if 和 fi是条件语句的括号,必须成对使用
命令表中的命令可以一条也可以多条
注释整段代码:
if false
then
fi
#!/bin/bash
read NUM
if false
then
if test $NUM -ge 10
then
if test $NUM -gt 10
then
echo ">10"
else
echo "==10"
fi
else
echo "<10"
fi
fi
if [ $NUM -ge 10 ]
then
echo ">=10"
else
echo "<10"
fi
补充:
-o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true
-a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false
! 非运算 例如 [ ! false ] 返回 true
&& 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true
| 位或 例如 echo $[2|2]
&位与 例如 echo $[2&1]
练习:从终端输入3个整数;从小到大排序
4.2case语句
格式:
case 变量 in
模式1)
命令表1
;;
模式2)
命令表2
;;
......
*)
命令表n
;;
esac
注意:
1)case语句只能检测字符串变量
2)命令表以单独的;;结束,退出case语句
3)模式n通常写为*,表示其他所有的模式
4)case匹配项中可以存在多个模式,每种模式之间|隔开
4.3for循环
格式:
for 变量名 in 单词表
do
命令表
done
变量依次从单词表中读取各个单词,每取一次单词,就执行一次循环体中的命令表,循环次数由单词表中的单词数决定,命令表中的命令可以一条,也可以是由分号或换行符分隔开的多条。
例如:
for语句的几种基本书写格式:
1)for i in 1 2 3 4 5
do
....
done
变量i从单词表中取值
2)for i
do
...
done
变量i从命令行取值,可以省略in 单词表
3)for i in {1..10}
do
...
done
变量i从1-10取值
4)for ((i=0;i<10;i++))
do
...
done
书写格式类似于c语言
#!/bin/bash
#1)
# for i in 1 2 3 4 5
# do
# echo -n "$i "
# done
# echo
#2)
# for i
# do
# echo -n "$i "
# done
# echo
#3)
# for i in {1..10}
# do
# echo -n "$i "
# done
# echo
# 4)
for ((n=1;n<=10;n++))
do
echo -n "$n "
done
echo
练习:实现1-10求和
4.4while
格式:
while 命令或表达式
do
命令表
done
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
4.5循环控制语句
break n:结束n层循环
continue n:结束n层本次循环,继续外层循环
#!/bin/bash
for ((i=0;i<3;i++))
do
for ((j=0;j<4;j++))
do
if test $j -eq 2
then
# break #00 01 10 11 20 21
# break 2 #00 01
# continue #00 01 03 10 11 13 20 21 23
# continue 2 #00 01 10 11 20 21
fi
echo -n "$i $j ,"
done
done
echo
标签:脚本,语句,shell,变量,10,高级,echo,命令,NUM
From: https://blog.csdn.net/thh135/article/details/140843727