Error[8]: Undefined offset: 55, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

Shell脚本学习总结

目录

脚本格式

输出

执行

多条命令处理实例

变量

常用系统变量

声明变量

撤销变量

声明静态(只读)变量

将变量提升为全局变量

特殊变量$n

特殊变量$#

特殊变量$*、$@

特殊变量$?

运算符

基本语法

实例

条件判断

基本语法

常用判断条件

实例

多条件判断

流程控制

if判断

case语句

for循环

while循环

read读取控制台输入

基本语法

函数

系统函数

实例

自定义函数

cut

基本用法

实例

sed

基本用法

实例

awk

基本用法

实例

sort

基本语法

实例


脚本格式

脚本以#!bin/bash开头

输出

echo ""

执行

使用"sh/bash 文件名"可以直接执行,直接使用文件名需要运行权限才可以执行

多条命令处理实例
#!/bin/bash

cd /home/atguigu/
touch banzhang.txt
echo "I love cls" >> banzhang.txt
变量

变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

等号两边不能有空格

在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

变量的值如果有空格,需要使用双引号或单引号括起来

常用系统变量

$HOME $PWD $SHELL $USER

声明变量
A=1
echo $A
撤销变量
unset A
声明静态(只读)变量
readonly B=3

静态变量不可unset,在系统重启后消失

将变量提升为全局变量
export B
特殊变量$n

$0为脚本名称,$1,$2,$3...为脚本第1,第2,第3个参数,超过10需要用${10}

#!/bin/bash
echo "
bash parameter.sh
#输出:
parameter.sh
"

直接运行

bash parameter.sh banzhang
#输出:
parameter.sh banzhang

输入一个参数

bash parameter.sh banzhang love mm
#输出:
parameter.sh banzhang love mm

输入三个参数

#!/bin/bash
echo $#

输入的参数多于三个时并不会报错,与输入三个时一致

特殊变量$#
bash parameter.sh banzhang love mm
#输出:
3
#!/bin/bash
echo $#
echo $*
echo $@

脚本名不算参数

特殊变量$*、$@

$*:代表命令行中所有的参数,把所有的参数看成一个整体

$@:代表命令行中所有的参数,把每个参数区分对待

bash parameter.sh banzhang love mm
#输出:
3
banzhang love mm
banzhang love mm
parameter.sh
#敲回车后这条指令正确执行
特殊变量$?

功能:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,有命令自己来决定),则证明上一个命令执行不正确。

echo $?
#输出
0
expr 3 + 2
#输出
5
运算符 基本语法
  1. “$((运算式))”或"$[运算式]"

  2. expr +,-,*,/,% 加,减,乘,除,取余 注意:expr运算符间要有空格

实例
expr `expr 2 + 3` * 4
#输出
20
s=$[(2+3)*4]
echo $s
#输出
20
[ 23 -ge 22 ]
echo $?
#输出
0
#输出0代表正确执行,即为true;非0代表没有正确执行,即为false
条件判断 基本语法

[ condition ]

注意:condition前后要有空格,条件非空即为true。[ atguigu ]返回true,[]返回false

常用判断条件

=字符串比较

数之间的比较:

-lt小于                    -le小于等于

-gt大于                  -ge大于等于

-eq等于                 -ne不等于

按照文件权限进行判断:

-r有读的权限         -w有写的权限

-x有执行的权限

按照文件类型进行判断:

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

-e文件存在           -d是否是一个目录

实例
[ -w helloworld.sh ]
echo $?
#输出
0
[ -e /home/atguigu/banzhang.txt ]
echo $?
#输出
0
[ condition ] && echo OK || echo notok
#condition为true时执行echo ok,为false时执行echo notok 
多条件判断

&&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令

#!/bin/bash
if [  -eq 1 ];then
    echo "banzhang zhen shuai"
elif[  -eq 2 ];then
    echo "cls zhen mei"
fi
流程控制 if判断

基本语法

if [ 条件判断式 ];then

程序

fi

或者

if [ 条件判断式 ]

then

程序

fi

注意:[ 条件判断式 ]中括号和条件判断式之间必须有空格,if后面也要有空格

实例

bash if.sh 1
#输出
banzhang zhen shuai
bash if.sh 2
#输出
cls zhen mei
#!/bin/bash
case  in
1)
    echo "banzhang"
    ;;
2)
    echo "cls"
    ;;
*)
    echo "renyao"
    ;;
esac
case语句

基本语法

case $变量名 in

"值1")

程序

;;

"值2")

程序

;;

*)

如果变量值都不是以上的值,则执行此程序

;;

esac

注意:case行尾必须为一个单词“in”,每个模式匹配必须以右括号“)”结束

实例

base case.sh 2
#输出
cls
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
    s=$[$s+$i]
done
echo $s
for循环

基本语法1

for(( 初始值;循环控制条件;变量变化 ))

do

程序

done

实例

bash for.sh
#输出
5050
 #!/bin/bash
 for i in "$*"
 do    
    echo "banzhang xihuan "
 done

基本语法2

for 变量 in 值1 值2 值3...

do

程序

done

实例

bash for2.sh mm cls xiaoze
#输出
banzhang xihuan mm cls boduo
 #!/bin/bash
 for i in $@
 do    
    echo "banzhang xihuan "
 done
bash for2.sh mm cls xiaoze
#输出
banzhang xihuan mm
banzhang xihuan cls
banzhang xihuan boduo
#!/bin/bash
i=1
s=0
while [ $i -le 100 ]
do
    s=$[$s + $i]
    i=$[$i + 1]
done
echo $s

当$*和$@都不加双引号""括起来时,都表示分开的所有参数

当都用双引号""括起来时$*会将所有参数合成一个整体作为的变量,$@仍然表示分开的所有参数

while循环

基本语法

while [ 条件判断式 ]

do

程序

done

实例

bash while.sh
#输出
5050
#!/bin/bash
read -t 7 -p "input your name " NAME
​
echo $NAME
read读取控制台输入 基本语法

read(选项)(参数)

选项:

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

-t:指定读值时等待的时间(秒)

参数

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

bash read.sh
#显示
input your name 
#输入
banzhang
#输出
banzhang
basename /home/atguigu/banzhang.txt
#输出
banzhang.txt
函数 系统函数

basename基本语法:

basename [string / pathname] [suffix]

作用:返回文件名

实例
basename /home/atguigu/banzhang.txt .txt
#输出
banzhang
dirname /home/atguigu/banzhang.txt
#输出
/home/atguigu

dirname基本语法:

dirname 文件绝对路径

作用:返回文件绝对路径(去除文件名部分)

function sum()
{
    s=0
    s=$[+]
    echo $s
}
​
read -p "input your parameter1:" P1
read -p "inout your parameter2": P2
​
sum $P1 $P2
自定义函数

[ function ] funname[()]

{

Action

[return int]

}

funname

注意:

必须在调用函数地方之前,先声明函数,shell脚本是逐行运行,不会想其他语言一样先编译

函数返回值只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值n(0-255)

bash sum.sh
#显示
input your parameter1:1
input your parameter2:2
#输出
cut -d " " -f 1 cut.txt	
cut

在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符字段输出

基本用法

cut [选项参数] filename

实例
cut -d " " -f 2,3 cut.txt	

以空格切割,取第一列

x cat cut.txt | grep guan 

以空格切割,取第二、三列

cat cut.txt | grep guan	| cut -d " " -f 1

查看cut.txt,并过滤出含有“guan”的行

sed "2a mei nv" sed.txt

查看cut.txt,并过滤出含有“guan”的行,然后对过滤结果进行切割

sed

对文件进行编辑处理并输出,但原文件内容不会改变

基本用法

sed [选项参数] 'command' filename

实例
sed "/wo/d" sed.txt

在第二行插入“mei nv”,并打印出来,注意,sed.txt文件并没有被更改

sed "s/wo/ni/g" sed.txt

删除包含“wo”的行

sed -e "2d" -e "s/wo/ni/g" sed.txt

将所有wo替换成ni

awk -F : '/^root/ {print }' passwd

将第二行删除,并将wo替换成ni

awk

作用与cut类似

基本用法

awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename

选项参数:

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

-v 赋值一个用户定义变量

实例
awk -F : '/^root/ {print ","}' passwd

passwd文件以“:”分隔,选取以root开头的行,显示第7列

awk -F : 'BEGIN{print "user,shell"} {print &1","} END{print "dahaige,bin/zuishuai"}' passwd

显示第1列和第7列,中间已“,”分隔

awk -F : -v i=1 '{print +i}' passwd

打印文件的第1列和第7列,中间用“,”分隔,并在全文的开头插入“user,shell”,在末尾插入“dahaige,bin/zuishuai”

awk -F : '{print FILENAME","NR","NF}' passwd

将文件的第3列所有数值加1并打印

sort -t : -nrk 2 sort.sh

打印文件的文件名、已读的记录数、浏览记录的域的个数(切割后,列的个数)

sort

将文件进行排序并输出

基本语法

sort(选项)(参数)

实例 [+++]

以“:”分隔,对第2列按数值大小进行倒叙排序

-t:设置分隔符

-n:按照数值大小排序

-r:逆序

-k:指定要排序的列

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Shell脚本学习总结_随笔_内存溢出

Shell脚本学习总结

Shell脚本学习总结,第1张

Shell脚本学习总结

目录

脚本格式

输出

执行

多条命令处理实例

变量

常用系统变量

声明变量

撤销变量

声明静态(只读)变量

将变量提升为全局变量

特殊变量$n

特殊变量$#

特殊变量$*、$@

特殊变量$?

运算符

基本语法

实例

条件判断

基本语法

常用判断条件

实例

多条件判断

流程控制

if判断

case语句

for循环

while循环

read读取控制台输入

基本语法

函数

系统函数

实例

自定义函数

cut

基本用法

实例

sed

基本用法

实例

awk

基本用法

实例

sort

基本语法

实例


脚本格式

脚本以#!bin/bash开头

输出

echo ""

执行

使用"sh/bash 文件名"可以直接执行,直接使用文件名需要运行权限才可以执行

多条命令处理实例
#!/bin/bash

cd /home/atguigu/
touch banzhang.txt
echo "I love cls" >> banzhang.txt
变量

变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

等号两边不能有空格

在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

变量的值如果有空格,需要使用双引号或单引号括起来

常用系统变量

$HOME $PWD $SHELL $USER

声明变量
A=1
echo $A
撤销变量
unset A
声明静态(只读)变量
readonly B=3

静态变量不可unset,在系统重启后消失

将变量提升为全局变量
export B
特殊变量$n

$0为脚本名称,$1,$2,$3...为脚本第1,第2,第3个参数,超过10需要用${10}

#!/bin/bash
echo "
bash parameter.sh
#输出:
parameter.sh
"

直接运行

bash parameter.sh banzhang
#输出:
parameter.sh banzhang

输入一个参数

bash parameter.sh banzhang love mm
#输出:
parameter.sh banzhang love mm

输入三个参数

#!/bin/bash
echo $#

输入的参数多于三个时并不会报错,与输入三个时一致

特殊变量$#
bash parameter.sh banzhang love mm
#输出:
3
#!/bin/bash
echo $#
echo $*
echo $@

脚本名不算参数

特殊变量$*、$@

$*:代表命令行中所有的参数,把所有的参数看成一个整体

$@:代表命令行中所有的参数,把每个参数区分对待

bash parameter.sh banzhang love mm
#输出:
3
banzhang love mm
banzhang love mm
parameter.sh
#敲回车后这条指令正确执行
特殊变量$?

功能:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,有命令自己来决定),则证明上一个命令执行不正确。

echo $?
#输出
0
expr 3 + 2
#输出
5
运算符 基本语法
  1. “$((运算式))”或"$[运算式]"

  2. expr +,-,*,/,% 加,减,乘,除,取余 注意:expr运算符间要有空格

实例
expr `expr 2 + 3` * 4
#输出
20
s=$[(2+3)*4]
echo $s
#输出
20
[ 23 -ge 22 ]
echo $?
#输出
0
#输出0代表正确执行,即为true;非0代表没有正确执行,即为false
条件判断 基本语法

[ condition ]

注意:condition前后要有空格,条件非空即为true。[ atguigu ]返回true,[]返回false

常用判断条件

=字符串比较

数之间的比较:

-lt小于                    -le小于等于

-gt大于                  -ge大于等于

-eq等于                 -ne不等于

按照文件权限进行判断:

-r有读的权限         -w有写的权限

-x有执行的权限

按照文件类型进行判断:

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

-e文件存在           -d是否是一个目录

实例
[ -w helloworld.sh ]
echo $?
#输出
0
[ -e /home/atguigu/banzhang.txt ]
echo $?
#输出
0
[ condition ] && echo OK || echo notok
#condition为true时执行echo ok,为false时执行echo notok 
多条件判断

&&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令

#!/bin/bash
if [  -eq 1 ];then
    echo "banzhang zhen shuai"
elif[  -eq 2 ];then
    echo "cls zhen mei"
fi
流程控制 if判断

基本语法

if [ 条件判断式 ];then

程序

fi

或者

if [ 条件判断式 ]

then

程序

fi

注意:[ 条件判断式 ]中括号和条件判断式之间必须有空格,if后面也要有空格

实例

bash if.sh 1
#输出
banzhang zhen shuai
bash if.sh 2
#输出
cls zhen mei
#!/bin/bash
case  in
1)
    echo "banzhang"
    ;;
2)
    echo "cls"
    ;;
*)
    echo "renyao"
    ;;
esac
case语句

基本语法

case $变量名 in

"值1")

程序

;;

"值2")

程序

;;

*)

如果变量值都不是以上的值,则执行此程序

;;

esac

注意:case行尾必须为一个单词“in”,每个模式匹配必须以右括号“)”结束

实例

base case.sh 2
#输出
cls
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
    s=$[$s+$i]
done
echo $s
for循环

基本语法1

for(( 初始值;循环控制条件;变量变化 ))

do

程序

done

实例

bash for.sh
#输出
5050
 #!/bin/bash
 for i in "$*"
 do    
    echo "banzhang xihuan "
 done

基本语法2

for 变量 in 值1 值2 值3...

do

程序

done

实例

bash for2.sh mm cls xiaoze
#输出
banzhang xihuan mm cls boduo
 #!/bin/bash
 for i in $@
 do    
    echo "banzhang xihuan "
 done
bash for2.sh mm cls xiaoze
#输出
banzhang xihuan mm
banzhang xihuan cls
banzhang xihuan boduo
#!/bin/bash
i=1
s=0
while [ $i -le 100 ]
do
    s=$[$s + $i]
    i=$[$i + 1]
done
echo $s

当$*和$@都不加双引号""括起来时,都表示分开的所有参数

当都用双引号""括起来时$*会将所有参数合成一个整体作为的变量,$@仍然表示分开的所有参数

while循环

基本语法

while [ 条件判断式 ]

do

程序

done

实例

bash while.sh
#输出
5050
#!/bin/bash
read -t 7 -p "input your name " NAME
​
echo $NAME
read读取控制台输入 基本语法

read(选项)(参数)

选项:

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

-t:指定读值时等待的时间(秒)

参数

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

bash read.sh
#显示
input your name 
#输入
banzhang
#输出
banzhang
basename /home/atguigu/banzhang.txt
#输出
banzhang.txt
函数 系统函数

basename基本语法:

basename [string / pathname] [suffix]

作用:返回文件名

实例
basename /home/atguigu/banzhang.txt .txt
#输出
banzhang
dirname /home/atguigu/banzhang.txt
#输出
/home/atguigu

dirname基本语法:

dirname 文件绝对路径

作用:返回文件绝对路径(去除文件名部分)

function sum()
{
    s=0
    s=$[+]
    echo $s
}
​
read -p "input your parameter1:" P1
read -p "inout your parameter2": P2
​
sum $P1 $P2
自定义函数

[ function ] funname[()]

{

Action

[return int]

}

funname

注意:

必须在调用函数地方之前,先声明函数,shell脚本是逐行运行,不会想其他语言一样先编译

函数返回值只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值n(0-255)

bash sum.sh
#显示
input your parameter1:1
input your parameter2:2
#输出
cut -d " " -f 1 cut.txt	
cut

在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符字段输出

基本用法

cut [选项参数] filename

实例
cut -d " " -f 2,3 cut.txt	

以空格切割,取第一列

x cat cut.txt | grep guan 

以空格切割,取第二、三列

cat cut.txt | grep guan	| cut -d " " -f 1

查看cut.txt,并过滤出含有“guan”的行

sed "2a mei nv" sed.txt

查看cut.txt,并过滤出含有“guan”的行,然后对过滤结果进行切割

sed

对文件进行编辑处理并输出,但原文件内容不会改变

基本用法

sed [选项参数] 'command' filename

实例
sed "/wo/d" sed.txt

在第二行插入“mei nv”,并打印出来,注意,sed.txt文件并没有被更改

sed "s/wo/ni/g" sed.txt

删除包含“wo”的行

sed -e "2d" -e "s/wo/ni/g" sed.txt

将所有wo替换成ni

awk -F : '/^root/ {print }' passwd

将第二行删除,并将wo替换成ni

awk

作用与cut类似

基本用法

awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename

选项参数:

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

-v 赋值一个用户定义变量

实例
awk -F : '/^root/ {print ","}' passwd

passwd文件以“:”分隔,选取以root开头的行,显示第7列

awk -F : 'BEGIN{print "user,shell"} {print &1","} END{print "dahaige,bin/zuishuai"}' passwd

显示第1列和第7列,中间已“,”分隔

awk -F : -v i=1 '{print +i}' passwd

打印文件的第1列和第7列,中间用“,”分隔,并在全文的开头插入“user,shell”,在末尾插入“dahaige,bin/zuishuai”

awk -F : '{print FILENAME","NR","NF}' passwd

将文件的第3列所有数值加1并打印

sort -t : -nrk 2 sort.sh

打印文件的文件名、已读的记录数、浏览记录的域的个数(切割后,列的个数)

sort

将文件进行排序并输出

基本语法

sort(选项)(参数)

实例

以“:”分隔,对第2列按数值大小进行倒叙排序

-t:设置分隔符

-n:按照数值大小排序

-r:逆序

-k:指定要排序的列

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5681479.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存