shell脚本语法学习
以下内容仅为个人学习使用,如有错误,欢迎指出
持续更新...............
一.首先创建.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脚本语法学习的更多相关文章
- 详细介绍Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- shell脚本语法基础汇总
shell脚本语法基础汇总 将命令的输出读入一个变量中,可以将它放入双引号中,即可保留空格和换行符(\n) out=$(cat text.txt) 输出1 2 3 out="$(cat te ...
- Shell脚本编程学习入门 02
Shell脚本编程学习入门是本文要介绍的内容,我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #! ...
- Linux shell脚本全面学习
Linux shell脚本全面学习 1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它 ...
- Linux shell脚本基础学习详细介绍(完整版)二
详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- Shell脚本基础学习
Shell脚本基础学习 当你在类Unix机器上编程时, 或者参与大型项目如k8s等, 某些框架和软件的安装都是使用shell脚本写的. 学会基本的shell脚本使用, 让你走上人生巅峰, 才怪. 学会 ...
- U-Boot shell脚本语法
/********************************************************************** * U-Boot shell脚本语法 * 说明: * 之 ...
- Shell脚本的学习(二)
Shell脚本的学习(二) 方法: 1) 一个计算器: 2)递归实现打印目录 3)方法调用
随机推荐
- Nginx中文url出现404问题
Nginx中文url出现404问题 前提条件检查,如我的系统centos,需要检查系统字符集是不是支持utf-8, 怎么配置可以参考这个帖子 https://www.vpser.net/manage/ ...
- [zz]蟑螂蚂蚁蚊子已不住在我家了!这个方法100%见效…
http://mt.sohu.com/20150324/n410238511.shtml 蚂蚁怕酸,蚊子怕辣,蟑螂怕香.在下给各位提供一个不杀生又能驱赶蚂蚁.蚊子.蟑螂的妙法. 一.蚂蚁怕酸味 家里的 ...
- 自己动手开发智能聊天机器人完全指南(附python完整源码)
一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...
- 【spring】之xml和Annotation,Bean注入的方式
基于xml形式Bean注入 @Data @AllArgsConstructor @NoArgsConstructor public class PersonBean { private Integer ...
- springMVC接收参数的区别form data与query string parameters与request payload
在AJAX请求中,我见过有三种form表单数据类型提交. 第一种:form data, 第二种:query string parameters,第三种:request payload. 在google ...
- sitemesh使用
参考文章: https://my.oschina.net/heroShane/blog/199177 http://blog.csdn.net/u013019926/article/details/1 ...
- 杂谈c.cpp
Endl确保程序运行前刷新输出(将其立即显示在屏幕上),而’\n’却不能保证 在c++中,是以分号分割的,所以可以把几条代码放在一行,也可以把一条代码放在几行 编译器负责分配和标记内存的细节 C++可 ...
- Python · 进度条
(这里是本章会用到的 GitHub 地址) 我实现的这个进度条可能是可以当做一个第三方库来使用的(这个人好自大,啧),它支持记录并发程序的进度且损耗基本只来源于 Python 本身 先来看看我们的进度 ...
- 200. Spring Boot JNDI:在Tomcat中怎么玩JNDI?
[视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源 ...
- JavaScript 下拉框 左边添加至右边
关于如何实现右边下拉框中选项的排序一时没有好的解决方法,等想到了回来补充 <!DOCTYPE html> <html> <head> <meta charse ...