shell 脚本笔记记录

tech2022-08-15  147

shell中的变量

shell $* 和 $@的区别

相同点:都是引用所有参数不同点:只有在双引号中表现出来,假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。 #!/bin/bash echo "-- \$* 演示 ---" for i in "$*"; do echo $i done echo "-- \$@ 演示 ---" for i in "$@"; do echo $i done $ bash test.sh 1 2 3 -- $* 演示 --- 1 2 3 -- $@ 演示 --- 1 2 3

特殊变量 $?

来描述上一条语句执行的返回状态,如果是0则表示上一条指令执行的没有问题。

sh-4.2$ $? sh: 0: command not found sh-4.2$ echo $? 127 sh-4.2$ echo $? 0

上图有三个指令,第一个指令显示命令未找到,返回异常。

在第二个指令中,使用echo $?打印上一个命令的状态(异常),所以是非0的。

在第三条,显示的是第二条指令的状态,是正常执行没有问题的,返回0。

运算符

基本语法

a) “ ( ( 运 算 式 ) ) ” 或 者 “ ((运算式))”或者“ (())[运算式]“

b) expr +,-,*,/,% expr运算符之间要有空格

例子

sh-4.2$ expr `expr 2 + 3` \/ 2 2 sh-4.2$ expr `expr 2 + 3` \* 4 20

采用第一种语法就比较方便了。

sh-4.2$ S=$[(2+3)*4] sh-4.2$ echo $S 20

条件判断

基本语法

[ condition ] 前后有空格

常用判断条件

(1)比较

= 字符串比较

-lt 小于(less than)

-le 小于等于(less equal)

-eq 等于(equal)

-gt 大于(greater than)

-ge大于等于(greater equal)

-ne 不等于(not equal)

(2)按照文件权限进行判断

-r 有读权限

-w 有写权限

-x 有执行的权限

(3)按照文件类型进行判断

-f 文件存在并且是一个常规的文件(file)

-e 文件存在(existence)

-d 文件存在并是一个目录(directory)

例子

sh-4.2$ [ -w parameter.sh ] sh-4.2$ echo $? 0

输出0表示正常执行,上一个命令返回true

流程控制(重点)

if 判断

基本语法

if [ 条件判断式 ]; then

​ 程序

fi

或者

if [ 条件判断式 ]

​ then

​ 程序

fi

if后面要有空格

例子

#!/bin/bash if [ $1 -eq "1" ] then echo "banzhang zhen shuai" elif [ $1 -eq "2" ] then echo "cls then mei" fi

case 语句

case $变量名 in "值1") 程序1 ;; "值2") 程序2 ;; *) 都不是 ;; esac

;; 表示命令序列结束,相当于java中的break

实例

#!/bin/bash case $1 in "1") echo "输入为1" ;; "2") echo "输入为2" ;; *) echo "输入其它" ;; esac sh-4.2$ bash case.sh 1 输入为1 sh-4.2$ bash case.sh 998 输入其它

for语句

例子1+…+100

#!/bin/bash s=0 for((i=0;i<=100;i++)) do s=$[$s+$i] done echo $s sh-4.2$ bash for1.sh 5050

while语句

while [ 条件判断式 ] do 程序 done

read读取控制台输入

基本语法

read (选项) (参数)

选项:

-p 指定读取值时的提示符

-t 等待时间(秒)

参数:

变量:指定读取值的变量名

例子

#!/bin/bash read -t 7 -p "Enter your name in 7 seconds " NAME echo $NAME sh-4.2$ bash read.sh Enter your name in 7s hqing hqing

函数

系统函数

basename

sh-4.2$ basename /dir1/test/showme.txt showme.txt sh-4.2$ basename /dir1/test/showme.txt .txt showme

最后一个变量时后缀,加上会去掉指定后缀

dirname

sh-4.2$ dirname /dir1/test/showme.txt /dir1/test

自定义函数

调用函数之前必须先声明函数返回值只能通过$?系统变量获得,可以显示加: return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255) #!/bin/bash function sum() { s=0 s=$[ $1 + $2 ] echo "$s" } read -p "Please input the number1: " n1; read -p "Please input the number2: " n2; sum $n1 $n2; sh-4.2$ bash fun.sh Please input the number1: 3 Please input the number2: 8 11

Shell工具(重点)

cut

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

参数说明

-f 提取第几列

-d 分隔符,按照指定分隔符分割列

sh-4.2$ cut -d " " -f 1 cut.txt dong guan wo lai le sh-4.2$ cat cut.txt dong sehn guan shen wo wo lai lai le le sh-4.2$ cat cut.txt | grep "guan" guan shen sh-4.2$ cat cut.txt | grep "guan" | cut -d " " -f 1 guan

sed

流编辑器,一次处理一行内容.

文件本身的内容并没有改变

sed [选项参数] ‘command’ filename

参数:-e 直接在指令列模式上进行sed的动作编辑

命令:

a 新增

d 删除

s 查找并替换

例子

sh-4.2$ cat sed.txt dong shen guan zhen wo wo lai lai le le 在第二行下添加 sh-4.2$ sed '2a mei nv' sed.txt dong shen guan zhen mei nv wo wo lai lai le le 删除操作 sh-4.2$ sed '/wo/d' sed.txt dong shen guan zhen lai lai le le 替换操作,g代表替换全局 sh-4.2$ sed 's/wo/ni/g' sed.txt dong shen guan zhen ni ni lai lai le le

awk

文本分析工具,将文件逐行读入,以空格作为默认分隔符将每行切片的部分再进行分析处理。

awk 选项参数 ’pattern1 {action1} pattern2{action2}…’ filename

选项参数:

-F 指定当输入文件分隔符

-v 复制一个用户定义变量

awk -F: '/^root/{print $1","$7}' passwd root,/bin/bash

sort

sort 选项 参数

选项:

-n 按照数值大小排序

-r 相反排序

-t 设置排序所用分隔符

-k 要排序的列

参数:待排序的文件列表

sh-4.2$ cat sort.sh bb:40:5.4 db:20:4.3 cls:10:3.5 zx:20:2.3 ss:30:1.6 sh-4.2$ sort -t : -nrk 3 sort.sh bb:40:5.4 db:20:4.3 cls:10:3.5 zx:20:2.3 ss:30:1.6
最新回复(0)