以下内容仅为个人学习使用,如有错误,欢迎指出

持续更新...............

一.首先创建.sh文件,打开并在文件的第一行输入#!/bin/sh

执行shell文件命令为:

. filename.sh

source filename.sh

二.常用命令

1.echo命令,变量

第二次变量赋值时,不用加$号,只有使用时才加

test='我是变量'
echo "$test"
或者
echo $test #如果这种情况使用变量,只需要在变量外加{}号
echo "it's num $testtest"
#改为
echo "it's num ${test}test"

#只读变量
var="variable"
readonly #删除变量
unset var_name #注意:只读变量是不可修改和删除的 #获取字符串长度
echo ${#var}
#截取字符串
echo ${var:1:3} #定义数组格式
array_name=(value0 value1 value2 value3)

#读取数组格式
valuen=${array_name[n]}

#读取数组长度,或者@变成*
length=${#array_name[@]}

#echo显示换行可以使用
echo -e "it \n is"
#显示结果到文件
echo "It is a test" > myfile
 

2.注释

#单行注释

# -------------------------

:<<EOF
多行注释
多行注释
多行注释
多行注释
EOF 或 :<<'
多行注释
多行注释
多行注释
' 又或者 :<<!
多行注释
多行注释
多行注释
!

3.read命令

用来读取用户在控制台上输入的内容

echo "please input you content"
#这里content自定义,就是一个变量名
read content echo "you input content is $content"

三.参数传递(函数调用的参数调用)

1.

#!/bin/sh

echo "共有$#个参数"
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "所有参数:$*"
echo "脚本运行的当前进程id号为:$$"
if [ $? == 0 ]
then echo "当前程序没有错误"
else
echo "程序发生错误"
fi

结果为:

当程序没有发生错误时,$?就会返回0

msw@bogon:~/Desktop$ . fun.sh 2 5
共有2个参数
第一个参数为:2
第二个参数为:5
所有参数:2 5
脚本运行的当前进程id号为:92957
当前程序没有错误

2.特殊字符处理参数:

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

四.数组

#!/bin/sh

#可以这样定义数组
new_array=('a' 2 'c' 4)
echo "The first element is ${new_array[0]}"
echo "Second element is ${new_array[1]}"
#获取数组的所有元素
echo "all element ${new_array[*]}"
echo "all element ${new_array[@]}"
#获取数组的长度
echo "element count is ${#new_array[*]}" # 也可以这样
two_array[0]=0
two_array[1]='b'
echo "The first element is ${two_array[0]}"
echo "Second element is ${two_array[1]}"

结果为:

The first element is a
Second element is 2
all element a 2 c 4
all element a 2 c 4
element count is 4
The first element is 0
Second element is b

五.循环大法 

#!/bin/sh

new_array=('a' 2 'c' 4)

# for 循环
echo "-----for cycle----"
for i in ${new_array[*]};
do
echo $i
done #while 循环 echo "-----while cycle----"
n=0
while [ $n -lt ${#new_array[@]} ]
do
echo ${new_array[$n]}
     # let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式
let n++
done

结果为:

-----for cycle----
a
2
c
4 -----while cycle----
a
2
c
4

六.运算符

1.

#!/bin/sh

a=8
b=5
echo "加 : `expr $a + $b `"
echo "减 : `expr $a - $b `"
echo "乘 : `expr $a \* $b `"
echo "除 : `expr $a / $b `"
echo "取余 : `expr $a % $b `"
if [ $a == $b ]
then
echo "a==b"
fi
if [ $a != $b ]
then
echo "a!=b"
fi

结果为:

加 : 13
减 : 3
乘 : 40
除 : 1
取余 : 3
a!=b

注意条件表达式的两边一定要留空格,否则会将运算表达式直接输出

msw@bogon:~/Desktop$ expr 1+2
1+2
msw@bogon:~/Desktop$ expr 1 + 2
3

这只是算数运算符,还有

2.关系运算符:

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

3.布尔运算符:

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

4.逻辑运算符:

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

5.字符串运算符:

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n "$a" ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

6.文件测试测试运算符

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

注意:使用 [[ ... ]] 条件判断结构,而不是 [ ... ],能够防止脚本中的许多逻辑错误。比如,&&||< 和 > 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。

用法就不一一介绍了

七.流程控制

上面和下面都用过了,此处就不在举例了

1.if...elif...else:格式如下

if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

2.for 循环:格式如下

for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

3.死循环:或while true

while :
do
command
done

4.until循环:与while循环刚好相反,until 循环执行一系列命令直至条件为 true 时停止。

until condition
do
command
done

例:循环输出n,直到n大于5

#!/bin/sh

n=0
until [ $n -gt 5 ]
do
echo $n
let n++
done

结果为:

0
1
2
3
4
5

5.case:Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac

例:

#!/bin/sh

echo "input you name first letter"
read name
case $name in
'm')
echo "you is msw"
;;
'w')
echo "you is wbd"
;;
*)
echo "i don't know you"
;;
esac

结果为:

msw@bogon:~/Desktop$ . case.sh
input you name first letter
m
you is msw
msw@bogon:~/Desktop$ . case.sh
input you name first letter
w
you is wbd
msw@bogon:~/Desktop$ . case.sh
input you name first letter
r
i don't know you

6.还有break和continue流程控制语句

n=0
while :
if [ $n == 3 ]
then
let n++
continue
fi
do
echo $n
let n++
if [ $n == 5 ]
then
break
fi
done

结果为:

0
1
2
4

到这里流程控制就差不多了

八.shell函数

1.

#!/bin/sh

#建立函数

new_function(){
echo "input one number"
read numone
echo "input one number again"
read numtwo
return $(($numone+$numtwo))
} #调用函数
new_function
#使用$?来获取函数的返回值
echo "you input two sum is $?"

结果为:

input one number
1
input one number again
2
you input two sum is 3

2.函数的参数调用

#!/bin/sh

new_fontion(){
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "第三个参数为:$3"
} new_function 1 4 2

结果为:

1
4
2

九.持续更新中.....

先上两小段代码吧

# 执行系统命令语法: `系统命令`
ip=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'`
#ip1=/sbin/ifconfig|sed -n '/inet addr/s/^[^:]*:\\([0-9.]\\{7,15\\}\\) .*/\\1/p' | grep -v 127.0.0.1
while True;
do
echo "$ip"
ipp=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'`
echo "$ipp"
if [ "$ip" != "$ipp" ];
then
`sudo shutdown -h 16:00`
else
echo "正常"
fi
sleep 1s
done

这段代码主要是监控ip地址是否发生改变,如果IP地址改变则执行关机

#!/bin/sh

echo "please input you name"
read name
echo "please input one number:"
read numbero
echo "please input one number again:"
read numbert
if [[ x$name == 'x' || x$numbero == 'x' || x$numbert == 'x' ]]
then
echo "you input has null"
elif [[ $numbero -gt $numbert && $name == 'msw' ]]
then
echo "you input one big"
elif [ $numbero -lt $numbert ]
then
echo "you input two big"
else
echo "ne"
fi

这段代码没什么意思,主要是联系我见天学习的几个命令和判断语法

重难点详解

x$name == 'x' 判断输入是否为空,还可以写成

[ -n $name ] :长度不为0则真

[ -z $name ] :   长度为0为真

注意:在[[]]中才可使用&& ||语法,如果是[],和是-a, 或是-o

  还有要注意字段间的空格

今天就先到这里吧!

























shell脚本语法学习的更多相关文章

  1. 详细介绍Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  2. shell脚本语法基础汇总

    shell脚本语法基础汇总 将命令的输出读入一个变量中,可以将它放入双引号中,即可保留空格和换行符(\n) out=$(cat text.txt) 输出1 2 3 out="$(cat te ...

  3. Shell脚本编程学习入门 02

    Shell脚本编程学习入门是本文要介绍的内容,我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):   #! ...

  4. Linux&nbsp;shell脚本全面学习

    Linux shell脚本全面学习 1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它 ...

  5. Linux shell脚本基础学习详细介绍(完整版)二

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  6. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  7. Shell脚本基础学习

    Shell脚本基础学习 当你在类Unix机器上编程时, 或者参与大型项目如k8s等, 某些框架和软件的安装都是使用shell脚本写的. 学会基本的shell脚本使用, 让你走上人生巅峰, 才怪. 学会 ...

  8. U-Boot shell脚本语法

    /********************************************************************** * U-Boot shell脚本语法 * 说明: * 之 ...

  9. Shell脚本的学习(二)

    Shell脚本的学习(二) 方法: 1) 一个计算器: 2)递归实现打印目录    3)方法调用

随机推荐

  1. 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题

    一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld"    B = & ...

  2. Cookie深度解析

    最近在公司做了Web端单点登录(SSO)功能,基于Cookie实现,做完之后感觉有必要总结一下,本文着重讲解Cookie,下文会说明单点登录的实现方案. Cookie简介 众所周知,Web协议(也就是 ...

  3. Python Day5 模块 包

    一:区分Python文件的2种用途 1个Python文件的2种用途 1.1 当作脚本执行:        if __name__ == '__main__': 1.2 当作模块导入使用     if ...

  4. 搭建sparksql的hive测试环境

    sbt依赖 name := "Pi" version := "1.0" scalaVersion := "2.10.6" libraryDe ...

  5. centos7安装elasticsearch6.3.x集群并破解安装x-pack

    一.环境信息及安装前准备 主机角色(内存不要小于1G): 软件及版本(百度网盘链接地址和密码:链接: https://pan.baidu.com/s/17bYc8MRw54GWCQCXR6pKjg 提 ...

  6. mybatis入门篇:通过SqlSession.selectList进行数据查询

    作为一个java菜鸟,早就从慕课网中学到一些基本的mybatis的用法,但是一直不成体系,懵懵懂懂,既然正式入了java这个坑,就打算好好学学,所以买了本<MyBatis从入门到精通>,在 ...

  7. qrcode生成二维码

    代码: <!DOCTYPE html> <html lang="en" style="height: 99%"> <head> ...

  8. 转载:指针delete后要设置为NULL

    本文来自:http://rpy000.blog.163.com/blog/static/196109536201292615547939/ 众所周知,最开始我们用new来创建一个指针,那么等我们用完它 ...

  9. leetcode5

    public class Solution { private int lo, maxLen; public String LongestPalindrome(String s) { int len ...

  10. Spring中AOP主要用来做什么。Spring注入bean的方式。什么是IOC,什么是依赖注入

    Spring中主要用到的设计模式有工厂模式和代理模式. IOC:Inversion of Control控制反转,也叫依赖注入,通过 sessionfactory 去注入实例:IOC就是一个生产和管理 ...