最全shell脚本语句语法使用(超详细)

博文大纲:

  • 1、对谈式脚本——read语句
  • 2、shell脚本中的测试的字符
  • 3、判断脚本举例
  • 4、条件判断——if语句
  • 5、条件判断——case语句
  • 6、条件判断——function函数结合case语句
  • 7、循环判断——while、until语句
  • 8、固定循环——for...do...done语句
  • 9、循环——cut、set结合for语句
  • 10、其他脚本类型举例
  • 11、shell脚本的追踪与debug

shell脚本的编写越规范越好,那么通常在每个shell脚本的开头几行会有如下几个方面相关的注释信息:

  • 脚本使用的shell,如/bin/bash;
  • 脚本的版本信息;
  • 脚本的作者与联络方式;
  • 脚本的history(编写时间记录);
  • 脚本内较特殊的指令,使用绝对路径的方式来下达;
  • 脚本运行是需要的环境变量预先宣告与设置。

废话不多说,直接上使用语法案例:

1、对谈式脚本——read语句

需求①:
first name 与 2. last name,最后并且在屏幕上显示:“Your full name is: ”的内容:

[[email protected] ~]# vim 1.sh   #编辑脚本,内容如下

#!/bin/bash
echo -e "yong lai xian shi wen jian full name:\n"
read -p "qing shu ru fir filename:" firname
read -p "qing shu ru sec filename:" secname
echo -e "\nyour full name is ${firname}${secname}."
#其中echo后面的“\n”表示换行
[[email protected] ~]# sh 1.sh      #执行脚本
yong lai xian shi wen jian full name:

qing shu ru fir filename:lv           #手动输入文件名开头
qing shu ru sec filename:jian         #手动输入文件名结尾

your full name is lvjian.     #它将自动将开头和结尾结合起来并输出

需求②:
假设我想要创建三个空的文件(通过touch),filename最开头由当前用户输入决定,假设使用者输入 filename 好了,那今天的日期是 2019/08/25 ,我想要以前天、昨天、今天的日期来创建这些文件。

[[email protected] ~]# vim 2.sh     #编辑脚本

#!/bin/bash
echo -e "yi ci chuang jian san ge file.\n"
read -p "qing shu ru filename:" filename
filename=${filename:-file}
date1=$(date --date ‘1 days ago‘ +%Y%m%d)
date2=$(date --date ‘2 days ago‘ +%Y%m%d)
date3=$(date +%Y%m%d)
file1="${filename}${date1}"
file2="${filename}${date2}"
file3="${filename}${date3}"
touch "${file1}"
touch "${file2}"
touch "${file3}"
[[email protected] ~]# sh 2.sh   #执行脚本
yi ci chuang jian san ge file.

qing shu ru filename:lv           #输入自定义的文件名开头

[[email protected] ~]# find /root -name "lv*"   #查看是否创建成功
/root/lv20190825
/root/lv20190827
/root/lv20190826

需求②:
如果我们要使用者输入两个变量,然后将两个变量的内容相乘,最后输出相乘的结果。

[[email protected] ~]# vim 3.sh      #编辑脚本

#!/bin/bash
echo -e "\nzhe shi yi ge suan cheng fa de jiao ben:\n"
read -p "qing shu ru yi ge shu zi:" A
read -p "qing shu ru di er ge shu zi:" B
sum=`echo "scale=4; ${A} * ${B}" | bc`
echo -e "\n${A}x${B} ==> ${sum}."
[[email protected] ~]# sh 3.sh        #执行脚本

zhe shi yi ge suan cheng fa de jiao ben:

qing shu ru yi ge shu zi:3        #输入第一个数
qing shu ru di er ge shu zi:4     #输入第二个数

3x4 ==> 12.                           #输出的结果

2、shell脚本中的测试的字符

上面所有的测试都是通过test进行的,可以使用“[ ]”来代替,将要测试的类型及指定的名字写在“[ ]” 即可,但是中括号里面两边必须有空格。(推荐使用中括号“[ ]”)

3、判断脚本举例

需求①:

  1. 这个文件是否存在,若不存在则给予一个“Filename does not exist”的讯息,并中断程序;
  2. 若这个文件存在,则判断他是个文件或目录,结果输出“Filename is regular file”或“Filename is directory”
  3. 判断一下,执行者的身份对这个文件或目录所拥有的权限,并输出权限数据!
[[email protected] ~]# vim 4.sh     #编辑脚本

#!/bin/bash
echo "yong lai ce shi wen jian huo dirctory."
read -p "qing shu ru yi ge wen jian ming:" filename
test -z ${filename} && echo -e "\nqing shu ru yi ge filename." && exit 0
test ! -e ${filename} && echo "filename does not exitst." && exit 0
test -f ${filename} && filetype="file"
test -d ${filename} && filetype="directory"
test -r ${filename} && prem="read"
test -w ${filename} && prem="${prem}+write"
test -x ${filename} && prem="${prem}+exe"
echo -e "\nthis is a ${filetype},it‘s perm.. is ${prem}."
[[email protected] ~]# sh 4.sh      #执行脚本
yong lai ce shi wen jian huo dirctory.
qing shu ru yi ge wen jian ming:/root    #输入一个目录名

this is a directory,it‘s perm.. is read+write+exe.      #脚本执行后输出的结果
[[email protected] ~]# sh 4.sh     #再执行脚本
yong lai ce shi wen jian huo dirctory.
qing shu ru yi ge wen jian ming:/etc/passwd      #输入一个文件

this is a file,it‘s perm.. is read+write.       #脚本执行后输出的结果

需求②:

1、当执行一个程序的时候,这个程序会让用户输入Y或N。
2、如果使用者输入Y或y时,就会显示OK,continue.
3、如果使用者输入N或n时,就会显示ON,interrupt.
4、如果不是Y/y/N/n之内的字符,那么将会死循环这个脚本,直到手动退出,或输入正确的值(其实稍作改动,可以改为若默认按回车的话可以等于输入“Y”,自行研究吧)。

[[email protected] ~]# vim 5.sh     #编辑脚本

#!/bin/bash
while [ "${yn}" != "Y" -o "${yn}" != "y" -o "${yn}" != "N" -o "${yn}" != "n" ]
do
read -p "qing shu ru ‘Y‘ or ‘N‘:" yn
[ "${yn}" == "Y" -o "${yn}" == "y" -o "${yn}" == "" ] && echo -e "\nOK,continue." && exit 0
[ "${yn}" == "N" -o "${yn}" == "n" ] && echo -e "\nON,interrupt." && exit 0
done
[[email protected] ~]# sh 5.sh     #下面是多次执行脚本,测试是否达到需求
qing shu ru ‘Y‘ or ‘N‘:

OK,continue.
[[email protected] ~]# sh 5.sh
qing shu ru ‘Y‘ or ‘N‘:y

OK,continue.
[[email protected] ~]# sh 5.sh
qing shu ru ‘Y‘ or ‘N‘:n

ON,interrupt.
[[email protected] ~]# sh 5.sh
qing shu ru ‘Y‘ or ‘N‘:u
qing shu ru ‘Y‘ or ‘N‘:i
qing shu ru ‘Y‘ or ‘N‘:N

ON,interrupt.

需求③:
1、程序的文件名为何?
2、共有几个参数?
3、若参数的个数小于 2 则告知使用者参数数量太少
4、全部的参数内容为何?
5、第一个参数为何?
6、第二个参数为何

[[email protected] ~]# vim 6.sh     #编辑脚本如下

#!/bin/bash
echo -e "\ncheng xu de wen jian ming shi ${0}"
echo -e "\nyi gong you $# ge can shu."
[ $# -lt 2 ] && echo "can shu tai shao le ." && exit 0
echo  "your whole parameter is ==> ‘$*‘."
echo "the 1st parameter ${1}."
echo "the 2nd parameter ${2}."
[[email protected] ~]# sh 6.sh a b c     #执行脚本

cheng xu de wen jian ming shi 6.sh

yi gong you 3 ge can shu.
your whole parameter is ==> ‘a b c‘.
the 1st parameter a.
the 2nd parameter b.
[[email protected] ~]# sh 6.sh a      #再次执行脚本

cheng xu de wen jian ming shi 6.sh

yi gong you 1 ge can shu.
can shu tai shao le .
#为了不为难自己,上面我用了拼音,多多体谅[ 捂脸 ]。

需求④:
查看本机都是否开启了www / ftp / mail服务,并将结果直观的显示出来

[[email protected] ~]# vim 11.sh 

#!/bin/bash
file="/dev/shm/a.txt"
netstat -anpt  > ${file}
awk -F : ‘{print $4}‘ ${file} | awk ‘{print $1}‘ | grep "80" &> /dev/null
if [ $? -eq 0 ]
        then
        echo -e "www service is up\n"
fi
awk ‘{print $4}‘ ${file} | egrep "20|21" &> /dev/null
if [ $? -eq 0 ]
        then
        echo -e "ftp service is up\n"
fi
awk ‘{print $4}‘ ${file} | grep "25" &> /dev/null
if [ $? -eq 0 ]
        then
        echo -e "mail service is up\n"
fi
[[email protected] ~]# sh 11.sh     #执行脚本测试
mail service is up

[[email protected] ~]# systemctl start httpd    #启动www服务再测试
[[email protected] ~]# sh 11.sh
www service is up

mail service is up

需求⑤:
都知道脚本后面的第一段是$1,第二段是$2....那么是否可以进行偏移呢,假设让原本的$2变为$1。

[[email protected] ~]# vim 7.sh      #编辑脚本如下

#!/bin/bash
echo "total parameter number is ==> $#"
echo "your whole parameter is ==> $* "
shift
echo "total parameter number is ==> $#"
echo "your whole parameter is ==> $* "
shift 3
echo "total parameter number is ==> $#"
echo "your whole parameter is ==> $* "
#“上面默认的shift”参数是偏移1个位置,也可以指定偏移的参数,如“shift 3”则表示向后偏移三个
[[email protected] ~]# sh 7.sh a b c    #执行脚本,并且追加三个参数
total parameter number is ==> 3
your whole parameter is ==> a b c
total parameter number is ==> 2
your whole parameter is ==> b c
total parameter number is ==> 2
your whole parameter is ==> b c
#从输出结果可以发现,偏移是累加的,第一次偏移了默认1位,
#第二次偏移了3位,那么实际已经偏移了原始参数的4位(因为累加)
#但是参数只有三个,所以它会循环偏移,所以结果还是b和c。

关于上面脚本中的“$#”、“$*”的解释可以参考如下解释:

4、条件判断——if语句

需求①:

1、当执行一个程序的时候,这个程序会让用户输入Y或N。
2、如果使用者输入Y或y或者直接按下回车键时,就会显示OK,continue.
3、如果使用者输入N或n时,就会显示ON,interrupt.
4、如果不是Y/y/N/n之内的字符,那么将输出“I don‘t know what your choice is”


[[email protected] ~]# vim 11.sh     #编写脚本

#!/bin/bash
read -p "Please input (Y/N): " yn

原文地址:https://blog.51cto.com/14154700/2433121

时间: 2024-10-07 23:35:50

最全shell脚本语句语法使用(超详细)的相关文章

shell脚本启动语法错误syntax error near unexpected token '{

执行shell脚本时失败,报语法错误,但脚本内容检查正常 原因为该脚本是在非Linux系统下编辑之后放到系统执行的,文件模式类型非Linux系统匹配的模式类型. 查看文件的模式类型 显示文件的模式类型为 dos 修改文件的模式类型为Linux匹配的 unix 保存之后即可正常启动脚本. shell脚本启动语法错误syntax error near unexpected token '{ 原文地址:https://www.cnblogs.com/zjfjava/p/10708370.html

shell脚本学习-语法篇

一. 条件测试:test [命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测 试结果为假,则命令的Exit Status为1(注意与C语言的逻辑表示正好相反). 二.if/then/elif/else/fi和C语言类似,在Shell中用if.then.elif.else.fi这几条命令实现分支控制.这种流程控制语句本质上也是由若干条Shell命令组成的,其实是三条命令,if [ -f ~/.bashrc ]是第一条,then . ~/.ba

Bash shell脚本的语法结构

目的:自我整理,自我回顾,自我反省! 内容:干货!干货!!干货!!! 附加:不足之处希望大家指正,能给像我一样的菜鸟一点启发就最好啦.仅仅是启发... 感谢:感谢老男孩(老看您的博文和视频,O(∩_∩)O哈哈~),当然还有网上的各路技术大牛,参考书籍<UNIX shell> Bash shell 脚本结构 #/bin/sh shbang行,脚本解释器. 如:#/bin/csh,#/bin/awk...等 # 注释. 如:This doc is writed chbo. shell元字符或通配符

使用自动化shell脚本查找CPU使用的详细线程信息

项目加了些拦截器代码后,CPU报警,显示CPU使用率超过100%: 想要查找到底是哪些代码消耗的资源过多,从网上找到一篇博文,转载如下: http://blog.csdn.net/guixunlong/article/details/8450897 在知道哪个Java进程CPU占用率过高以后: 1.使用命令 jstack PID 命令打印出CPU占用过高进程的线程栈,例如jstack 12012 > 12012.txt 2.使用top -H -p PID 命令查看对应进程是哪个线程占用CPU过高

SHELL脚本的语法知识1

① $符号的使用方法:(摘自-网络) $0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9$* 这个程式的所有参数,此选项参数可超过9个.$# 这个程式的参数个数$$ 这个程式的PID(脚本运行的当前进程ID号)$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)$? 执行上一个指令的返回值 (显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误)$- 显示shell使用的当前选项,与set命令功能相同[email protected] 跟$*类似,但是可

SHELL脚本的语法知识2

①shell的数值计算 $[[ 空格]$a[空格 ]operator[空格]$b[空格]] 计算时操作符及其操作数必须要用方括号[]括起来,然后用$作为前导符,[空格]表示此处空格可有可无 eg: ` a=2;b=3;echo $[ $a + $b] ` #屏幕输出 5 ②脚本运行时与用户的交互 ` read  x ` 程序运行到此处时会暂停并提示用户输入数值,用户输入完毕并回车后,程序将用户输入的值赋给x,x为任意变量名 eg: ` read x ` ` read -p "please ent

SHELL脚本的语法知识3

①管理Linux w 查看当前系统的负载 /proc/cpuinfo 保存服务器CPU相关信息 grep -c 'processor' /proc/cpuinfo 计算服务器CPU个数 vmstats 监控系统状态 top 显示进程所占系统资源 sar 监控系统状态 sar -n DEV 查看网卡流量 xargs 把其他命令的输出作为其后命令的输入 find ./ -mtime +10 | xargs rm find *.txt | xargs -n1 -i{} mv {} {}_bak 把后缀

SHELL脚本的语法知识——流程控制

①if-elif-elif-else-fi if-fi ` if(($a > 30));then echo $a;fi `       or ` if [ $a -gt 30 ];then echo $a;fi ` if-else-fi ` if(($a = 30));then echo $a;else echo 30;fi ` or ` if [ $a -eq 30 ];then echo $a;else echo 30;fi ` if-elif-elif-else-fi ` if(($a >

SHELL脚本的语法知识——数值计算

①$[] $[ $a operator $b ] 例: a=2;b=3;  echo $[ $a + $b] # 5 echo $[$a-$b] #-3 echo $[++$a-$b] #0 c=$[$a+$b] # √ c=6 d=$[a+b] # 6 备注:除了自加自减运算符其他都支持;只能进行整数运算;++在操作数前面时不会报错也不会自加;$[]会输出运算结果 ②let let a=b+c 例:a=1;b=2; let c=a+b;echo $c # 3 let c=++a+b;echo