Shell脚本笔记

1.最简单的Shell脚本

Shell脚本是以行为单位的,脚本中所包含的成分主要有:注释(#)、命令、Shell变量和结构控制语句。

用户可以使用任何文本编辑器编辑Shell脚本文件,如vi、gedit等。

脚本的调用的两种方式:

sh script-file

./script-file

执行时要考虑脚本是否具有可执行权限,sh可以执行没有可执行权限的脚本

另一种调用方法是先将脚本文件的访问权限修改为可执行:

chmod u+x script-file

或:

chmod 744 script-file

查看文件权限:

ls -l

当执行一个脚本文件时,Shell就产生一个子Shell(即一个子进程)去执行命令文件中的命令。因此脚本中的变值不能传递到当前Shell(即父进程Shell)

一个最简单的script:

#!/bin/bash

# Program

# This program shows "Hello World!"

echo -e "Hello World.\n"

exit 0

#!/bin/bash 在调用bash脚本时,以#!开头的语句通知系统用何解释器执行此脚本

如果bash是默认的Shell,那么脚本的开头也不用非得写上#!

脚本说明应包括:

脚本名词、脚本功能、版权声明、复杂脚本应对算法做简要说明

2.Shell 变量

name=string

name是变量名,变量名用小写字母命名

=是赋值符号,两边不能有空格,否则将视为命令

v1=centos

v2=’this is a shell script test.’

Shell脚本中的变量只有整数和字符串

eg:

v2='This is a test from zhanghongo.'

echo $v2

在调用的Shell变量之前加上$符号

eg:

a=10

b=20

echo $(($a+$b))

echo $((10+20*30-40))

((c=2+3+4-5))

echo $c

在Shell中做加减乘除模取余运算,要加上两层小括号,而且要在输出的值之前加上$符号

Shell字符串变量表达式:

表达式

说明

${#string}

$string的长度

${string:position}

从position开始提取字符串

${string:position:length}

从位置position开始提取长度为$length的子串

${string#substring}

从开头删除最短匹配子串

${string##substring}

从开头删除最长匹配子串

${string%substring}

从结尾删除最短匹配子串

${string%%substring}

从结尾删除最长匹配子串

包含字符串操作后的脚本,如果使用sh script-file执行,会报错:Bad substitution

可以使用以下方式执行不会报错

./script-file

bash script-file

#删除开始的字符串

echo ${str#I love}

#删除开始I到.的所有字符串(最短匹配)

echo ${str#I*.}

#删除开始I到.的所有字符串(最长匹配)

echo ${str##I*.}

#如果*后面没有字符(如:echo ${str##I*}),则只删除*前面的字符串,并不会删除*表示的部分,*表示任意字符串

#如果字符串开头是空格,则用echo输出的时候,默认会省略开头的空格

3.文件判断——test与[]

test:

标志

说明

-f

文件是否存在

-d

目录是否存在

-r

文件是否有读权限

-w

文件是否有写权限

-x

文件是否有执行权限

eg:

#判断是否存在/home/sky/mytest,存在就输出exist,否则输出not exist

filename=/home/sky/mytest

test -f $filename && echo 'exist' || echo 'not exist'

eg:

#判断目录是否存在,存在就输出exist,否则输出not exist

directoryname=/home/sky

test –d $directoryname && echo ‘exist’ || echo ‘not exist’

中括号[]判断注意

-在中括号中必须都要使用空格来分隔——4个空格

-在中括号中的变量,最好都要用双引号括起来

-在中括号中的常数,最好都以单引号括起来

eg:

[ “$a” == ”$b” ] && echo ‘Yes’ || echo ‘No’

[ ‘12’ == ’10’ ] && echo ‘Yes’ || echo ‘No’

条件判断:

单分支判断:

if []; then

echo statement

fi

双分支判断:

if []; then

echo statement1

else

echo statement2

fi

多分支判断:

if []; then

echo statement1

elif []

echo statement2

elif []

echo statement3

else       # else可以省略

echo statement4

fi

条件选择判断:注意执行语句要用;;结束

case $name in

1);;

esac

if语句在中括号中同时使用test判断文件是否存在时,会报错:

test: line 7: [: -f: binary operator expected

原因是:中括号和test都是表示判断。

修改方法:

#method1:去掉test,使用中括号做判断

filename=/home/sky/mytest1

if [ -f $filename];then

echo 'The file is exist.'

else

echo 'The file is not exist.'

fi

# method2:去掉中括号,使用test做判断

filename=/home/sky/mytest1

if test -f $filename;then

echo 'The file is exist.'

else

echo 'The file is not exist.'

fi

eg:使用多分支条件

#!/bin/bash

# Program

# function: view hardware infomation

echo 'Please input your hardware to view.'

read hd

if [ $hd == cpu ]; then

echo 'Your cpu info is.'

cat /proc/cpuinfo

elif [ $hd == mem ]; then

echo 'Your memory is.'

cat /proc/meminfo

elif [ $hd == hard ]; then

echo 'Your harddisk is.'

df -h

else

echo 'I dont know what your input'

fi

多分支选择语句,用sh script-file执行时,会出现错误

使用bash script-file执行,不会出现错误

eg:使用case多选

#!/bin/bash

# Program

echo 'Please input a number.'

read kemu

case $kemu in

yuwen)

echo "Your input number is yuwen.";;

shuxue)

echo "Your input number is shuxue.";;

yingyu)

echo "Your input number is yingyu.";;

*)

echo "I dont know what you input";;

esac

#注意事项:

只要变量kemu的输入字符串和条件判断的字符串一样,就视为条件成立

条件后面要加右括号

执行语句结束要加两个分号

case条件语句以esac结束

循环操作:

while循环:

while condition;do

done;

until循环:

untile condition;do

done;

for循环:

for(());do

statement

done;

总结:3种循环都是以done结束循环

1.while循环

eg: while loop

#!/bin/bash

# while loop

i=10

while (($i>=5));do

echo $i;

((i--));

done;

特殊条件运算符号:-eq  -ne  -gt   -ge   -lt   -le

一般运算符分别是: ==  !=    >   >=    <    <=

总结:在双层小括号中支持一般的比较运算符,但是在中括号中,只能支持特殊条件运算符

eg:  使用while循环实现输出10到100,使用中括号[]作为条件判断

min=10

max=100

while [ $min -le $max ]  #注意[]中需要4个空格,中括号中只支持特殊条件运算符

do

echo $min

min=`expr $min + 1`    #注意此处不是单引号,而是Tab上面那个键单独按下输入的符号;等号前后无空格

done

eg:  使用while循环,实现输出10到小于100能被4整除的整数,使用双层小括号作为条件判断

i=10

while(($i<100))    #双层小括号支持一般运算符

do

if(($i%4==0))

then

echo $i

fi

i=$(($i+1))             #赋值运算的形式

done

2.for循环

eg:用for循环输出从1到10的整数

for i in {1..10};  #分号可加可不加,理解成集合语法

do

echo $i

done

eg:for循环条件的另一种形式,理解成集合

for i in 1 2 3 4 5

do

echo $i

done

eg:for循环输出1到100的整数

for i in `seq 100`

do

echo $i

done

eg:for循环条件的另一种格式,类似于java语言

for((i=1;i<100;i++))

do

if((i%3==0))

then

echo $i

fi

done

3.until循环

eg:输出0到不大于5的整数的的平方

i=0

until [ $i –gt 5]

do

let “square=i*i”       #let语法

echo “$i * $i = $square”

let “i++”

done

eg:使用for循环输出99乘法口诀表

for i in `seq 9`   #seq语法,这里不是单引号,是Tab键上面那个

do

for j in `seq $i`      #seq语法,注意i前面要加上$符号

do

let "temp = i * j"            #let语法,引号中间定义了一个temp变量,变量i,j之前不需要加$符号

echo -n "$i*$j=$temp  "   #-n表示不换行输出

done

echo "" #换行

done

Shell脚本中的function

  1. 必须在函数调用前先申明函数

eg:根据用户输入的参数,输出对应的数;假设脚本保存为:func

#!/bin/bash

function print() {

echo "Your input is $1"        #$1是用户默认输出的第1个参数

}

echo "This program will print your selection!"

case $1 in

"one")

print 1;;      #调用print函数,并个其传递默认参数1

"two")

print 2;;

*)

print "not 1 or 2.";;

esac

调用本脚本的方法:bash func one  #one是传递给脚本的默认参数

eg:定义两个变量相加的函数fSum

#!/bin/bash

fSum 3 2;

function fSum()  # $0表示函数本身

{

echo $1,$2;

return $(($1+$2));

}

fSum 5 7;   #调用函数,可以像使用一个新定义的命令

total=$(fSum 3 2)    #在小括号中,也可以像使用命令一样,调用函数

echo $?

echo "return"

echo $total;

假设本脚本定义为testfun1.sh

如果要在shell中直接调用某个sh脚本的某个函数,需要先source命令,再调用该函数:

source testfun1.sh

fSum 2 3

函数删除:

unset –f 函数名

转载于:https://www.cnblogs.com/HITSZ/p/8243129.html

shell脚本学习笔记(2)相关推荐

  1. shell脚本学习笔记一

    又开始写学习笔记了,呵呵... 今年打算选择一门技术系统的学习一下.编程语言.虚拟机技术.数据库.大数据.云计算在这些种类中,我选择了shell编程.为什么选择shell呢?也没有什么具体的原因.以前 ...

  2. Shell脚本(学习笔记1)

    shell脚本学习记录 为什么学习shell脚本? 在一些复杂的linux维护工作过程中,大量的重复性的输入和交互操作不但费时费力,而且容易出现错误:然而编写shell脚本程序,可以批量处理.自动化的 ...

  3. shell 脚本学习笔记

    shell 脚本学习总结: 文件表达式 -e filename 如果 filename存在,则为真 -s file exists and has a size greater than zero. 判 ...

  4. shell脚本——学习笔记(包含应用案例)

    题头为本人编写shell脚本格式^v^ #!/bin/bash #**************** #Author: Pakho #Date: 2021-00-00 #FileName: .sh #* ...

  5. shell脚本学习笔记 (流编辑器sed)

    sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出.sed不 ...

  6. shell脚本学习笔记01

    shell脚本 1.shell定义 Shell Script [1] ,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是 ...

  7. linux 命令自动填充,Shell脚本学习笔记之(自动填充函数模板)

    其实,vii 就是写的一个脚本,跟 vi 没半毛钱关系,只不过借用一下这个名字而已.那这个脚本长什么样呢?look: 下面来详细的解析上面的代码,来看第1行: #!/bin/bash 这是Shell脚 ...

  8. 菜鸟教程之Shell 脚本学习笔记(二)

    Shell 传递参数 $# :传递到脚本的参数个数: $0: 执行的文件名: $n:n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推-- $*:以一个单字符串显示所有 ...

  9. 菜鸟教程 之 shell 脚本学习笔记 (一)

    1. Bash 是大多数Linux 系统默认的 Shell,在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改 ...

最新文章

  1. 【Dlib】dlib和opencv的互转
  2. Matlab与线性代数 -- 矩阵的重组4
  3. 2021-10-14 yolov5踩坑!!!经验大赏
  4. c语言程序设计 赵宏,C语言程序设计(模块化程序设计I )(6页)-原创力文档...
  5. 你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?
  6. 《统计学》学习笔记之分类数据分析
  7. c语言什么时候需要加分号,归纳一下html中什么时候需要分号什么时候需要冒
  8. [转载] python判断字符串中包含某个字符串_干货分享| Python中最常用的字符串方法
  9. 1097 特殊的整数数列求和
  10. html页面访pdf样式,html网页布局模板.pdf
  11. excel表格打印每页都有表头_Excel打印表格不再手忙脚乱
  12. 红包达人app是真的吗,红包达人怎么玩?红包达人官方下载最新最全教程
  13. 坚果手机2系统相册问题
  14. p6000 深度学习_英伟达推Quadro新显卡,支持VR、深度学习等技术
  15. 罗永浩2011年保利剧院演讲(一个理想主义者的创业故事II)
  16. vscode 单击跳转_vscode中ctrl+鼠标左键不能跳转_编程开发工具
  17. 网络安全产品之堡垒机介绍以及应用案例
  18. 踢出京东方之后,苹果降低对中国制造的依赖,偏向越南和印度制造,值得深思...
  19. 华为平板鸿蒙系统什么时候上线,鸿蒙系统上线时间基本确认,于6月2日正式来袭,花粉的幸福来了...
  20. Matlab代码导入STM32F103流程

热门文章

  1. IIS 域名 泛解析
  2. flutter 制作渐变色按钮
  3. 竟然如此简单!输入明星名字就可以直接爬取高清图片
  4. 上海亚商投顾:A股三大指数震荡涨跌各异 大消费全天活跃
  5. 青岛最新公交线路一览(216-232)
  6. “脚踏实地,追逐梦想“
  7. scoped 不生效_.vue文件 加scoped 样式不起作用的解决方法
  8. Qt之线程的使用(moveToThread方式)
  9. 移动硬盘数据的文件突然找不到了,该如何恢复?
  10. 为什么TCP4次挥手时等待为2MSL?