shell脚本学习笔记(2)
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
- 必须在函数调用前先申明函数
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)相关推荐
- shell脚本学习笔记一
又开始写学习笔记了,呵呵... 今年打算选择一门技术系统的学习一下.编程语言.虚拟机技术.数据库.大数据.云计算在这些种类中,我选择了shell编程.为什么选择shell呢?也没有什么具体的原因.以前 ...
- Shell脚本(学习笔记1)
shell脚本学习记录 为什么学习shell脚本? 在一些复杂的linux维护工作过程中,大量的重复性的输入和交互操作不但费时费力,而且容易出现错误:然而编写shell脚本程序,可以批量处理.自动化的 ...
- shell 脚本学习笔记
shell 脚本学习总结: 文件表达式 -e filename 如果 filename存在,则为真 -s file exists and has a size greater than zero. 判 ...
- shell脚本——学习笔记(包含应用案例)
题头为本人编写shell脚本格式^v^ #!/bin/bash #**************** #Author: Pakho #Date: 2021-00-00 #FileName: .sh #* ...
- shell脚本学习笔记 (流编辑器sed)
sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出.sed不 ...
- shell脚本学习笔记01
shell脚本 1.shell定义 Shell Script [1] ,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是 ...
- linux 命令自动填充,Shell脚本学习笔记之(自动填充函数模板)
其实,vii 就是写的一个脚本,跟 vi 没半毛钱关系,只不过借用一下这个名字而已.那这个脚本长什么样呢?look: 下面来详细的解析上面的代码,来看第1行: #!/bin/bash 这是Shell脚 ...
- 菜鸟教程之Shell 脚本学习笔记(二)
Shell 传递参数 $# :传递到脚本的参数个数: $0: 执行的文件名: $n:n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推-- $*:以一个单字符串显示所有 ...
- 菜鸟教程 之 shell 脚本学习笔记 (一)
1. Bash 是大多数Linux 系统默认的 Shell,在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改 ...
最新文章
- 【Dlib】dlib和opencv的互转
- Matlab与线性代数 -- 矩阵的重组4
- 2021-10-14 yolov5踩坑!!!经验大赏
- c语言程序设计 赵宏,C语言程序设计(模块化程序设计I )(6页)-原创力文档...
- 你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?
- 《统计学》学习笔记之分类数据分析
- c语言什么时候需要加分号,归纳一下html中什么时候需要分号什么时候需要冒
- [转载] python判断字符串中包含某个字符串_干货分享| Python中最常用的字符串方法
- 1097 特殊的整数数列求和
- html页面访pdf样式,html网页布局模板.pdf
- excel表格打印每页都有表头_Excel打印表格不再手忙脚乱
- 红包达人app是真的吗,红包达人怎么玩?红包达人官方下载最新最全教程
- 坚果手机2系统相册问题
- p6000 深度学习_英伟达推Quadro新显卡,支持VR、深度学习等技术
- 罗永浩2011年保利剧院演讲(一个理想主义者的创业故事II)
- vscode 单击跳转_vscode中ctrl+鼠标左键不能跳转_编程开发工具
- 网络安全产品之堡垒机介绍以及应用案例
- 踢出京东方之后,苹果降低对中国制造的依赖,偏向越南和印度制造,值得深思...
- 华为平板鸿蒙系统什么时候上线,鸿蒙系统上线时间基本确认,于6月2日正式来袭,花粉的幸福来了...
- Matlab代码导入STM32F103流程