Shell脚本
shell的特殊字符
|
- 作用:管道
- 示例
- forune | lolcat
` ` 作用:命令置换: 示例: echo `ls` (echo 在终端显示)
>> 输出重定向 > 覆盖输入 >> 最佳输入 示例: echo Hello world >> 1.c通配符
- *:匹配所有字符
- {起始…结束} 创建连续的文件
- [ ]
- rm [13579].c 删除了1.c 2.c 3.c 4.c 5.c
- rm [1-5].c 删除了1-5.c
- ?:匹配一个字符串
- [^ ]:删除除了指定的文件,只能通配一个
⭐️ shell脚本
本质:shell命令的有序集合
bash解释器
- 作用:指向.sh脚本
编写shell脚本
- 创建一个.sh的文件
- 写shell命令
- 执行
- 通过bash这个解释器来执行
- 通过./来执行,但是需要有执行权限,使用chmod来给文件提权
示例
#!/bin/bash //第一行一般都这样写,表示解释器的路径 cp ../1.c 1.c cp ../2.c 2.c >> 1.c Hello worldshell中0表示真,1表示假
shell变量
自定义变量
没有数据类型,默认为字符串类型
赋值不能隔开
变量名=值
没有分号,换行相当于分号
变量的调用需要加$
#!/bin/bash a=2 echo $a位置变量
- 命令行参数的变量,从终端传递参数给shell脚本
- 从$0开始到9如果要打印9以后的变量需要加{ },例如{12}
环境变量
- 计算机定义好的变量
- env可以查看所有环境变量
- 调用需要加$
预定义变量
计算机给出一些特殊变量赋予特殊意义
格式 描述 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数。
如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。$$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与*相同,但是使用时加引号,并在引号中返回每个参数。<br/>如"@“用「”」括起来的情况、以"$1" “2" … "n” 的形式输出所有参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 变量的四则运算
( () )
- 不能进行浮点运算
- 调用的时候要加钱$
- 可以进行幂数运算
#!/bin/bash a=$((3**3)) echo $a 结果为27[ ]
- 不能进行浮点运算
- 调用的时候要加钱$
- 可以进行幂数运算
#!/bin/bash a=$[ 3+3] echo $a 结果为6expr
- 需要命令置换符置换出来结果
- 算数之间需要空开
- 当进行乘法的时候需要用\区分,其他都不需要
#!/bin/bash a='expr 1 \* 2' a='expr 1\*2'//报错 需要空开 echo $a 结果为2练习
- 交换a,b的值
#!/bin/bash a=$[ 3 * 3 * 3] b=$((5*7)) c=$a a=$b b=$c echo a=$a b=$b >> 1.txtShell语句
字符串比较
- test 字符串1 = 字符串2 ---- 比较两个字符串是否相等
- test 字符串1 != 字符串2 ---- 比较两个字符串是否不相等
- test -z 字符串 ---- 判断字符串为不为空
- test -n 字符串 ---- 判断字符串是否为不空
#!/bin/bash a="hello" b="hello" test $a != $b test -z $a test -n $a echo $? //?表示上一个结果整数比较
- -eq ---- 等于
- -ne ---- 不等于
- -gt ---- 大于
- -lt ---- 小于
- -ge ---- 大于等于
- -le ---- 小于等于
#!/bin/bash test 23 -eq 32 echo $? #?表示上一个结果 结果 1 #shell中1表示假,0表示真文件比较
- -e 文件 ---- 判断文件是否存在
- -f 文件 ---- 判断文件是否为普通文件
- -L 文件 ---- 判断文件是否为链接文件
- -S 文件 ---- 判断文件是否为套接字文件
- -b 文件 ---- 判断文件是否为块文件
- -c 文件 ---- 判断文件是否为字符文件
- -d 文件 ---- 判断文件是否为目录文件
#!/bin/bash test -d $1 #$1表示从命令行去获取参数 echo $? #?表示上一个结果
-p 文件 ---- 判断文件是否为管道文件
文件1 -nt 文件2 ---- 判断文件1是否比文件2新(时间戳)
文件1 -ot 文件2 ---- 判断文件1是否比文件2旧(时间戳)
-o ---- 或 or
-a ---- 与 and文件权限
#!/bin/bash test -d $1 -o -f $2 #$1 $2表示从命令行去获取参数 echo $? #?表示上一个结果
- -r ---- 判断文件是否有可读写权限
- -w ---- 判断文件是否有可写权限
- -x ---- 判断文件是否有可执行权限
read ----- 把终端上的输入传给参数
- 用法 :read 变量1 变量2 …
- 参数:
- read -p “提示” 变量名 ---- 给出提示
- read -t 时间(秒) 变量名 ---- 超过时间自动停止
- read -n 数字 变量名 ---- 显示输入的个数,超出个数也会自动结束
- read -s ---- 隐藏输入,不显示
控制语句
if
- 第一种
if [] then shell 语句; fi #注意 if 和[]中需要加空格
- 第二种
if test语句 then shell 语句; fi #注意 if 和[]中需要加空格if -elif -else
#!/bin/bash read a if test -e $a then if test -w $a then echo "hello World" >> $a else chmod u+w $a echo "hello World" >> $a fi else touch $a chmod u+w $a echo "hello World" >> $a ficase
case 表达式 in 值1) 语句1 ;; 值2) 语句2 ;; . . . *) 语句n esacwhile
while 表达式 do shell语句 done ((a--)) --->表示自减 #示例 #!/bin/bash a=5 while test $a -gt 0 do ((a--)) echo $a done
死循环
while true do shell语句 donefor
- 方式一
for((表达式1;表达式2;表达式3)) do shell语句 done #示例 !/bin/bash i=5 for((i=0;i<5;i++)) do echo $i done
方式二
for 变量 in 单词表 do shell语句 done #示例 #!/bin/bash i=5 for i in he li oi asda adsa ada ad do echo $i done方式三----连续的
- for 变量 in {起始…结束}
1 #!/bin/bash i=5 for i in {a..z} do echo $i done
- for 变量 in
#!/bin/bash i=5 for i in `ls` do echo $i doneshell数组
- shell脚本中只有一维数组
- 没有数据类型
#声明 :数组名=(元素1 元素2 元素3...) arr=(hello world nihao shijie) echo ${arr[0]}
遍历数组
arr=(hello world nihao shijie) echo ${arr[*]} echo ${arr[@]}求数组的长度
arr=(hello world nihao shijie) echo ${#arr[*]} 结果是4练习---- > 交换数组
#!/bin/bash arr=(hello world chengdu sichuan asss) right=$[${#arr[*]} - 1] left=0 temp=0 while (test ${left} -le ${right}) do temp=${arr[left]} arr[left]=${arr[right]} arr[right]=$temp ((left++)) ((right--)) done echo ${arr[*]}练习:求1到100的和
#!/bin/bash sum=0 i=5 for((i=0;i<101;i++)) do sum=$(($sum+$i)) done echo "sum=$sum" #!/bin/bash sum=0 i=5 for((i=0;i<101;i++)) do sum=`expr $sum + $i` done echo "sum=$sum"shell 函数
没有数据类型
没有写形参,但是可以传参
只有调用函数后,里面的东西才会生效
定义:
#第一种 funtion 函数名() { return 返回值 } #第二种 函数名(){ return 返回值 }调用:直接函数名
获取返回值 : $?
函数的传参
- 函数名 实参1 实参2…
- 函数体中用$1, $2, 3...{15}来接收
