脚本以#!/bin/bash开头(指定解析器)
接下来创建一个Shell脚本,输出helloworld
touch hello.sh
写入 命令
#!/bin/bash
echo “helloworld”
保存后执行,图中分为绝对路径和相对路径执行,sh bash一样功能,只不过sh指向bash,是个软连接,最后也是调用bash;直接在根目录下执行需要赋予脚本权限
第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
在shell目录下创建一个demo.txt,在demo.txt文件中增加“I like drinking Coke”。
#!/bin/bash
touch demo.txt
echo "I like drinking Coke" >> demo.txt
常用系统变量: H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER等,方便在文件写入操作。
1.基本语法
(1)定义变量:变量=值
(2)撤销变量:unset 变量
(3)声明静态变量:readonly变量,注意:不能unset
2.变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
(5)可把变量提升为全局环境变量,可供其他Shell程序使用:export 变量名
sxh@learn-basis:shell$ A=4 //定义变量A
sxh@learn-basis:shell$ echo $A
4
sxh@learn-basis:shell$ A=9 //给变量A重新赋值
sxh@learn-basis:shell$ echo $A
9
sxh@learn-basis:shell$ unset A //撤销变量A
sxh@learn-basis:shell$ echo $A
sxh@learn-basis:shell$ readonly B=2 //声明静态的变量B=2,不能unset
sxh@learn-basis:shell$ echo $B
2
sxh@learn-basis:shell$ unset B
bash: unset: B:无法取消设定: 只读 variable
sxh@learn-basis:shell$ C=1+2 //在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
sxh@learn-basis:shell$ echo $C
1+2
sxh@learn-basis:shell$ D=I love you //变量的值如果有空格,需要使用双引号或单引号括起来
/*error
Command 'love' not found, but can be installed with:
sudo snap install love # version 11.2+pkg-d332, or
sudo apt install love # version 11.3-1
See 'snap info love' for additional versions.
*/
sxh@learn-basis:shell$ D="I love you"
sxh@learn-basis:shell$ echo $D
I love you
sxh@learn-basis:shell$ vi hello.sh
写入#!/bin/bash
echo "hello sxh"
echo $C
sxh@learn-basis:shell$ ./hello.sh
hello sxh
//发现并没有打印输出变量C的值。
sxh@learn-basis:shell$ export C //把变量提升为全局环境变量,可供其他Shell程序使用
sxh@learn-basis:shell$ ./hello.sh
hello sxh
1+2 //success
新建文件写入
#!/bin/bash
echo “$0 $1 $2”
输出该脚本文件名称、输入参数1和输入参数2 的值,参数3已经不再输出了
编辑文件写入 echo $#
获取输入参数的个数
∗ (功能描述:这个变量代表命令行中所有的参数, * (功能描述:这个变量代表命令行中所有的参数, ∗(功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)
@ (功能描述:这个变量也代表命令行中所有的参数,不过 @ (功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)
两个都是打印输入的所有参数
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了)
sxh@learn-basis:shell$ ./para.sh a b c
./para.sh a b
3
a b c
a b c
sxh@learn-basis:shell$ echo $?
0 //返回0表示正确
(1)“ ( ( 运算式 ) ) ”或“ ((运算式))”或“ ((运算式))”或“[运算式]”
(2)expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
`expr 3 + 2` 先运算加法 \*再运算乘法
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
(2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
语法:
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
demo:输入一个数字,如果是1,则输出I like drinking Coke,如果是2,则输出I like to drink Sprite,如果是其它,什么也不输出。
#!/bin/bash
if [ $1 -eq "1" ];then
echo "I like drinking Coke"
elif [ $1 -eq "2" ]
then
echo "I like to drink Sprite"
fi
语法:
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
demo:输入一个数字,如果是1,则输出I like drinking Coke,如果是2,则输出I like to drink Sprite,如果是其它,输出nothing。
#!/bin/bash
case $1 in
1)
echo "I like drinking Coke"
;;
2)
echo "I like to drink Sprite"
;;
*)
echo "nothing"
;;
esac
基本语法1:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
demo:从1加到100
#!/bin/bash
S=0
for((i=0;i<=100;i++))
do
S=$[$S+$i]
done
echo $S
基本语法2:
for 变量 in 值1 值2 值3…
do
程序
done
demo:打印所有输入参数
sxh@learn-basis:shell$ touch for2.sh
sxh@learn-basis:shell$ vi for2.sh
#!/bin/bash
for i in $*
do
echo "this is a char $i"
done
sxh@learn-basis:shell$ sh for2.sh a
this is a char a
sxh@learn-basis:shell$ sh for2.sh a b
this is a char a
this is a char b
sxh@learn-basis:shell$ sh for2.sh a b c
this is a char a
this is a char b
this is a char c
比较 ∗ 和 *和 ∗和@区别
(a) ∗ 和 *和 ∗和@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 2 … 2 … 2…n的形式输出所有参数。
sxh@learn-basis:shell$ vi for2.sh
#!/bin/bash
for i in $*
do
echo "this is a char $i"
done
for j in $@
do
echo "this is a char $j"
done
sxh@learn-basis:shell$ sh for2.sh a
this is a char a
this is a char a
sxh@learn-basis:shell$ sh for2.sh a b
this is a char a
this is a char b
this is a char a
this is a char b
sxh@learn-basis:shell$ sh for2.sh a b c
this is a char a
this is a char b
this is a char c
this is a char a
this is a char b
this is a char c
(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 2 … 2 … 2…n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “ 2 ” … ” 2”…” 2”…”n”的形式输出所有参数。
#!/bin/bash
for i in "$*"
do
echo "this is a char $i"
done
for j in "$@"
do
echo "this is a char $j"
done
基本语法:
while [ 条件判断式 ]
do
程序
done
sxh@learn-basis:shell$ touch while.sh
sxh@learn-basis:shell$ vi while.sh
sxh@learn-basis:shell$ cat while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
sxh@learn-basis:shell$ sh while.sh
基本语法:
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名
demo:提示5秒内,读取控制台输入的名称
sxh@learn-basis:shell$ touch read.sh
sxh@learn-basis:shell$ vi read.sh
sxh@learn-basis:shell$ cat read.sh
#!/bin/bash
read -t 5 -p "Enter your name in 5 seconds" NAME
echo $NAME
sxh@learn-basis:shell$ sh read.sh
read.sh: 3: read: Illegal option -t
sxh@learn-basis:shell$ bash read.sh
Enter your name in 5 secondsaaaa
aaaa
sxh@learn-basis:shell$
对于出现的错误:
unbuntu上运行对于 -s -t参数
bash read.sh和 ./read.sh可以正确执行,对于sh read.sh不能正确执行,报错
read.sh: 4: read: Illegal option -t
对于参数选项 -n 也是一样的
basename基本语法:
basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
dirname基本语法:
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
1.基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
funname
2.经验技巧
(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
demo:计算两个输入参数的和
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
1.基本用法
cut [选项参数] filename
说明:默认分隔符是制表符
2.选项参数说明
选项参数 | 功能 |
---|---|
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列 |
sxh@learn-basis:shell$ touch cut.txt
sxh@learn-basis:shell$ vi cut.txt
sxh@learn-basis:shell$ cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
sxh@learn-basis:shell$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
sxh@learn-basis:shell$ cut -d " " -f 2,3 cut.txt
shen
zhen
wo
lai
le
sxh@learn-basis:shell$ cat cut.txt | grep "guan" | cut -d " " -f 1
guan
//这里是过滤文件找到guan那一行,然后对这一行进行cut
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
sed [选项参数] ‘command’ filename
选项参数 | 功能 |
---|---|
-e | 直接在指令列模式上进行sed的动作编辑。 |
命令 | 功能描述 |
---|---|
a | 新增,a的后面可以接字串,在下一行出现 |
d | 删除 |
s | 查找并替换 |
sxh@learn-basis:shell$ touch sed.txt
sxh@learn-basis:shell$ vi sed.txt
sxh@learn-basis:shell$ cat sed.txt //数据准备
dong shen
guan zhen
wo wo
lai lai
le le
sxh@learn-basis:shell$ sed '2a hi hao' sed.txt
dong shen //将“hi hao”这个单词插入到sed.txt第二行下,打印。
guan zhen
hi hao
wo wo
lai lai
le le
sxh@learn-basis:shell$ cat sed.txt //文件不会有变化,只是输出有变化
dong shen
guan zhen
wo wo
lai lai
le le
sxh@learn-basis:shell$ sed '/wo/d' sed.txt //删除sed.txt文件所有包含wo的行
dong shen
guan zhen
lai lai
le le
sxh@learn-basis:shell$ sed 's/wo/ni/g' sed.txt //将sed.txt文件中wo替换为ni
dong shen
guan zhen
ni ni
lai lai
le le
sxh@learn-basis:shell$ sed -e '2d' -e 's/wo/ni/g' sed.txt
dong shen //将sed.txt文件中的第二行删除并将wo替换为ni
ni ni
lai lai
le le
sxh@learn-basis:shell$
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数 | 功能 |
---|---|
-F | 指定输入文件折分隔符 |
-v | 赋值一个用户定义变量 |
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
sort(选项)(参数)
选项 | 说明 |
---|---|
-n | 依照数值的大小排序 |
-r | 以相反的顺序来排序 |
-t | 设置排序时所用的分隔字符 |
-k | 指定需要排序的列 |