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

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

一.首先创建.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. JavaScript获取mp4文件MIME编码格式,用于判读是否是h.264,解决在线播放只有声音问题

    测试网址:https://gpac.github.io/mp4box.js/test/filereader.html js库:mp4box.js 不能在线播放的:audio/mp4; codecs=& ...

  2. <realsense D400>同步采集深度图和彩色图

    利用深度相机采集深度图和彩色图会面临一个问题,如何实现同步采集数据? 以下是我搜集到的两点方法: 1)高翔博士提到他的orbslam2教程有这么一步工作,具体目录为 example/RGBD/. (等 ...

  3. 【常用命令】Linux相关命令

    [[TOC]] iostat - 查看系统I/O状况 -k Display statistics in kilobytes per second -m Display statistics in me ...

  4. bui框架nav导航图标一览

    权限  .nav-permission   仓库  .nav-storage   库存  .nav-inventory   用户  .nav-user   订单  .nav-order   商品  . ...

  5. 源码:Java集合源码之:哈希表(二)

    要想知道一个元素是否在数组或链表中,只能从前向后挨个对比,无论是数组还是链表,其对数据的查询表现都比较无力.在的二叉排序树中,还会将数据排序以进行二分查找,将时间复杂度从O(n)降低到O(lg n). ...

  6. 01.JDBC操作数据库-快速入门操作

    /** * 简单入门操作 * 注:先将mysql-connector-java-5.1.36.jar 构建 Build Path环境当中去 * @param args * @throws Except ...

  7. Error when loading the SDK 发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素

    Error when loading the SDK: Error: Error parsing D:\DIRS\Java\android-sdk-windows\system-images\andr ...

  8. java中的静态变量、静态方法与静态代码块详解与初始化顺序

      我们知道类的生命周期分为装载.连接.初始化.使用和卸载的五个过程.其中静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...

  9. CSS笔试题

    如何实现移动端9宫格 如何实现移动端下列8宫格 实现移动端图片画廊CSS样式 写一个简单的animation的css动画 美化select,radio,range样式,只需考虑谷歌浏览器,下面给出的是 ...

  10. js跨域传值,兼容ie8以上

    js跨域传值,兼容ie8以上 事先说明,此方法并不支持ie8,如果想要支持ie8的话,需要用这种思路(来自微软): if (window.addEventListener) { window.addE ...