Linux——Shell使用学习
来源:互联网 发布:哈尔滨java招聘 编辑:程序博客网 时间:2024/06/05 16:33
Shell脚本是个十分便捷的东西,在日常工作中能在某种程度上提高我们得工作效率。Shell是一个命令解析器,简单来讲就是把各类命令丢到里面,从而可以使程序一次性执行,它不需要编译就可以直接执行。因此,使用Shell来进行一些重复性的工作,一些批量处理的工作等都是很高效的,为我们节省不少时间。
Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sH或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等。
这里关注Bash,大多数Linux系统默认的就是Bash这个Shell,下面以它为例子进行学习总结。
一、变量
1、Shell里并不像C语言一样使用变量时要提前声明,而是在使用的时候创建。
2、注意Shell里变量是区分大小写的。
3、默认以字符串方式存储,所以要想进行数值运算要做一些处理。
4、获取变量内容就在变量名前加$
。如:$var
。
以一段Shell为例:
#!/bin/bash #说明我们使用的是Bash# TEST1#值得注意的是,定义变量时 '='号左右两边不能有空格var1=10 #定义变量var1var2="Hi,Allen" #定义变量var2,字符串中有空格的情况,需要使用引号将字符串括起来echo $var1 #输出变量var1的值echo $var2 #输出变量var2的值
使用read
我们还可以用read来获取用户输入的值,将其赋给变量。通常按下回车read命令结束。
# TEST2read var3 #读入用户输入echo $var3
引号
以代码来理解:
# TEST3my_name="Allen"echo "This is $my_name" #把$expression放在双引号里,执行到时会把变量的值替换进来echo 'This is $my_name' #把$expression放在单引号里,不会替换echo "This is \$my_name" #在双引号里,$前加上 \ 转义字符来取消它的含义,同样不会替换#有一种情况,按这样定义并不会输出"This is Allenhaha",因为他把my_namehaha认为是一个新变量,正确的做法是加上一对{}。echo "This is $my_namehaha" #$expression为空echo "This is ${my_name}haha" #正确的做法
输出如下:
This is AllenThis is $my_nameThis is $my_nameThis is This is Allenhaha
参数变量
Shell脚本程序开始执行时,一些变量根据环境设置中的值进行初始化:
$HOME:当前用户的主目录;$PATH:以冒号分隔的用来搜索命令的目录列表;$0:Shell脚本的名字;$#:传递给脚本的参数个数;$$:Shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件。
如:
#TEST4echo "脚本名: $0"echo "参数个数: $#"echo "home: $HOME"echo "pid: $$"
输出:
脚本名: ./bash_test.sh参数个数: 0home: /home/tangbinpid: 4341
数值运算
前面提到,变量的值默认是字符串存储,若想做一些运算,则可以这样做:
#TEST5num1=20num2=2add=$(($num1+$num2))sub=$(($num1-$num2))mul=$(($num1*$num2))div=$(($num1/$num2))echo "$num1 + $num2 = $add"echo "$num1 - $num2 = $sub"echo "$num1 x $num2 = $mul"echo "$num1 ÷ $num2 = $div"
输出:
20 + 2 = 2220 - 2 = 1820 x 2 = 4020 ÷ 2 = 10
二、判断
test
或[
命令
Shell的布尔判断命令[
或test
,当使用[
命令时,我们还使用符号]
来结尾。
例子:
#TEST6 if test -f my_file.shthen echo "my_file.sh exists."fi if [ -f tangbin.c ] #这里需注意 [ 和 ] 左右都要有空格;若里面有组件,每个组件都需要有空格来分隔;若里面有变量或者常量以" "括起来。then echo "tangbin.c exists."else echo "Can't find file"fi
test的使用可以归为三类:
1.字符串比较;
2.算术比较;
3.文件相关的条件测试。
三、条件控制
类似于C语言,Shell里也有相应的控制结构:
if:
if conditionthen statementselse statementsfi
上面已有例子。
elif:
if conditionthen statementselif conditionthen statementselse statementsfi
例子:
#TEST7echo "Is it 9:00 PM? please answer yes or no."read clockif [ "$clock" = "yes" ] #记得此处的 [ = ]号左右空格;变量、常量都加上 " " then echo "Yes,it is."elif [ "$clock" = "no" ] #同上then echo "No,it isn't."else echo "Sorry, $timeofday not recognized. Enter yes or no." exit 1fi
for:
for variable in valuesdo statementsdone
例子:
#TEST8cd ~mkdir shell_testcd shell_testfor((i=0; i<10; i++)) #在~/shell_test下创建0~9个txt的文件do touch $i.txtdone
while:
while conditiondo statementsdone
例子:
#TEST9echo "Enter your name:"read namewhile [ "$name" != "Allen" ]do echo "Sorry, enter again." read namedone
until:
与while类似,只是把条件反过来了。
until conditiondo statementsdone
case:
case比较复杂,它具备匹配多个模式,然后执行多条相关语句的能力,这使得它非常适合于处理用户的输入。
case variable in pattern [ | pattern] ...) statements;; pattern [ | pattern] ...) statements;; ...esac
例子:
#TEST10echo "which books do you want? Enter: 1, 2, 3, 4"read inputcase "$input" in 1 ) echo "sanguoyanyi";; 2 ) echo "hongloumeng";; 3 ) echo "xiyouji";; 4 ) echo "shuihuzhuan";; * ) echo "Sorry,can't find";;esac
case执行,input内容会与下面的字符串匹配,一旦匹配成功,就会执行 )
后的语句 。 *
代表通配符,若没有匹配,则默认执行 *
后的默认动作。
&&和||操作符
这个C语言的规则是一样的。 statement1 && statement2 && statement3 && ...
statement1 || statement2 || statement3 || ...
四、函数
Shell里也有函数,与C语言不同的是,不能在调用前进行声明。它是定义后才能调用。同样Shell函数里也能传入参数($*、$@、$#、$1、$2、$var1、$var2……等)
,当函数执行完毕后,这些参数会恢复为它们先前的值。也就是说,函数可以访问全局作用范围内的其它Shell变量。如果一个局部变量和一个全局变量的名字相同,前者就会覆盖后者,但仅限于函数的作用范围之内。
使用local
关键字可以在函数体里声明局部变量,local text="local_var"
function name(){ statements}
例子:
#TEST11 function Add(){ echo "进行两数的相加运算:" echo "input num1" read num1 echo "input num2" read num2 echo "相加结果为:" return $(($num1+$num2)) #参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)}Addecho "$?" #显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
五、追踪与调试
Shell也是个程序,难免有出错的地方,像我们编写调试C程序可以借助gdb调试。Shell的调试可以以Bash的参数进行判断:
sh -n/-v/-x example.sh-n:不要执行script,仅查询语法是否正确-v:执行script之前,先将script的内容输出到屏幕-x:将使用到的script内容显示到屏幕上(常用)
在此先简单总结到这里,Shell还有其他很多的知识点,比如一些常用命令。《鸟哥的Linux私房菜》都有比较详细的介绍,网上资料也很多,重点是想要熟练使用还得多自己编写程序才能加深理解。
- Linux——Shell使用学习
- linux shell编程学习——数组使用
- linux shell 学习(九)——函数基本使用
- Linux学习——Shell
- 【Linux学习笔记】Shell 基础(1) — Shell简介
- linux学习笔记——shell
- Linux学习——shell编程
- Linux学习——shell命令
- Linux学习笔记——Bash Shell
- Linux学习——Shell基础
- Linux——shell学习笔记
- Linux——Shell学习笔记2
- linux学习笔记—shell概述
- Linux——bash shell 使用技巧
- Linux——bash shell 使用技巧
- Linux Shell变量的使用轻松学习
- Linux基础学习-Shell的使用环境
- Linux学习笔记:shell的初次使用
- 2017 Multi-University Training Contest 7 && HDU 6121 Build a tree 【思维】
- python的下划线
- 辣子鸡一步一爪印,页面滚动,ScrollView
- 用js刷新当前页面的几种方法,包括reload方法、replace方法、自动刷新方法等。
- fabric源码解析13——peer的BCCSP服务
- Linux——Shell使用学习
- MessagePack使用
- sdut 数据结构实验之查找五:平方之哈希表
- 四.c++中的算法--排序及相关操作---根据某个元素排序
- 3-7远程块存储ISCSI
- CSS 学习笔记——关于样式表插入的补充
- #bzoj3394#雪后村庄(启发式合并 + 哈希)
- 2105. 【NOIP2016普及组复赛】魔法阵
- Mongodb浅解