Shell脚本学习(一)

Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,Linux中最常用的是bash。

脚本语言是一种解释型语言,会执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code),再由计算机运行。

而我们常见的C、C++、Java都是编译型语言。这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。

#!/bin/bash
echo "Hello World !"

“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。

像perl脚本通常会在第一句加上

#!/usr/bin/perl -w

对于加上这些标记的脚本,可以通过修改权限直接执行它们,比如这样:

chmod +x ./test.sh
./test.sh

chmod 是linux中修改权限的一个命令,+x表示给后面那个文件加上可执行的属性。

然后使用./test.sh就能运行脚本了。

为什么一定要用./test.sh才能运行脚本,直接使用test.sh却不行呢?

因为PATH这个环境变量默认后面是没有加./的,如果直接执行test.sh自然是无法被找到的

[[email protected] addPort]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

当然如果不加这个约定的标记,只需要这样就能执行bash脚本了

bash test.sh

使用 read 命令可以读取终端stdin的数据

read inputString
echo "input String is $inputString"

会发现上面两个inputString一个加了$一个没有加,为什么?

我的理解是,当这变量被当做左值时,不需要加$,而当这个变来那个被当做右值时,必须加$

Shell声明一个变量

testString1="hello"
testString2=‘world‘
testInt=123

初始化的时候必须注意的是,=号两边都不能有空格,不然是错误的,shell对格式的要求比较严格。

使用变量的时候就需要加上$符号了,因为这个时候它被当做一个右值来使用。

echo $testString1
echo $testString2
echo "${testInt}456"

当然,必要的时候需要加上花括号,这样才会跟后面的字符串分隔开,用作解释器限定边界。

readonly :在变量前面加上readonly可以限定为只读变量

unset:使用unset可以删除变量,删除变量以后再输出这个变量将不会有数据输出。

shell当中存在二种变量类型,分别是局部变量环境变量

局部变量只能在shell当前脚本中使用,而环境变量能被创建它们的shell脚本以及派生出来的子进程中使用。

在Shell当中还有一些比较特殊的变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
[email protected] 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

$n和C语言main函数当中的char* argv[]比较相似,都是传递进来的参数,$#对应的就是int argc了,比如有两个路径,需要分别用ls命令查看目录信息,这个时候可以这样:

#!/bin/bash
myPath1=$1
myPath2=$2
ls $1
ls $2
echo $#

然后执行这个脚本

[[email protected] /]# chmod +x 123.sh
[[email protected] /]# ./123.sh /mnt/ /usr/
cdrom  hgfs
bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
2

第一行打印的就是第一个参数ls以后的列表,第二行打印的就是第二个参数ls以后的列表,第三行打印的就是参数的个数。

$*和[email protected]被直接使用的时候,他们的参数都会被当成一个个体使用,而当两者都被""包含时,"$*"会将参数组合成一个整体字符串输出,而"[email protected]"的参数任然是一个个体。

时间: 2024-11-05 22:38:52

Shell脚本学习(一)的相关文章

笔记——shell脚本学习指南

<shell脚本学习指南>机械工业出版 ISBN 987-7-111-25504-8 第2章 2.4 初级陷阱 1.当今的系统,对#!这一行的长度限制从63到1024个字符都有,尽量不要超过64个字符. 2.在某些系统上,命令行部分包含了命令的完整路径名称.不过有些系统却不是这样:命令行的部分会原封不动地传递给被引用的程序. 3.别在选项之后放置任何空白,因为空白也会跟着选项一起传递给被引用的程序. 4.你需要知道解释其的完整路径名称.这可以用来规避可移植问题,因为不同的厂商可能将同样的东西放

shell脚本学习指南

以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bash shell 脚本的第一行,#!之后应该是什么? 如果拿这个问题去问别人,不同的人的回答可能各不相同.我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env sh.这算是编程界的“’茴’字四种写法”了. 在多数情况下,以上五种写法都是等价的.但是,写过程序的人都知道:“少数情况”里往往隐藏

shell脚本学习与总结

shell脚本学习总结,东西很多,供初学者参考. shell脚本是区分大小写的. 2.Unix特殊字符有: ( ; $ ? & * () [] ` ' " + 使用其时要进行转义() 3.Shell的注释以#开头 4.函数的定义Function fuction_name(){ Command to execute} 调用时直接用function_name. 5.控制结构 1)If...then语句 If [ test_command ]    Then    Commandsfi2)If

shell脚本学习笔记系列--1

一.学好shell编程的知识储备 1.相关Linux系统命令应用: 2.Vi/vim 编辑器的熟练使用,相关客户端软件的设置: 3.基础的服务,系统服务ntp,crond,网络服务:nfs,rsync,inotify,sersync,ssh,lanmp等. 补充:清空日志的三种方法: 1)echo  " " > filename.log 2)>filename.log 3)cat  /dev/null > filename.log 注:工作中有的时候不能删除(日志)文

shell脚本学习笔记:通过shell实现linux用户管理和监控

学习shell做的第一个脚本,感谢云知梦李强强老师的shell编程教程 创建shell脚本文件: touch menu.sh touch index.sh touch welcome.sh 赋予脚本文件可执行权限: chmod a+x menu.sh index.sh welcome.sh menu.sh #!/bin/bash #menu.sh function menu(){ title="My Home" name="Randy" time=`date +%Y

shell脚本学习笔记 (sed的高级用法----模式空间和保持空间)

前段时间在学习shell脚本,上次有提到sed的模式空间和保持空间概念,但是一直没有研究好,这两天研究了一下,所以将它发出来,不是很全面,仅仅供大家参考一下. 保持空间sed在正常情况下,将处理的行读入模式空间,脚本中的"sed command(sed命令)"就一条接着一条进行处理,直到脚本执行完毕.然后该行被输出,模式被清空:接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕. 模式空间可以比喻为一个生产线,而保持空间则可以被比喻为仓库,这个比喻希望可以帮助大家理解

shell 脚本学习

距离上一次写东西又隔了一段时间了,期间一直跟着私房菜学习,还是没养成定期做记录的习惯,今天就来写第一个脚本的编写吧. 经过几天的积累,学习了下shell脚本的编写,目前掌握的还不太成熟,凡事从小入手肯定是没错的,先写个简单的吧(难的也不会写o(╯□╰)o). 这个脚本的执行方法,就是输入生日来计算当前日期距离生日还有多少天,如果已经过完生日则计算来年生日的时间. #!/bin/bash #Program: #    Calculate how long it takes to have a bi

Shell脚本学习一:shell三种引号学习

一.Shell中变量的声明和引用 [[email protected] ~]# var1=Hello [[email protected] ~]# echo $var1 Hello [[email protected] ~]# echo ${var1}World HelloWorld 在Shell中,变量的引用使用$. 上面的代码中,$var1就是对变量var1的引用,输出的结果是Hello. 如果想链接其他字符,将变量放到大括号{}里面,然后在后面跟上其他内容. 例如上面的代码中:${var1

Shell 脚本学习笔记十:Shell输入输出重定向

command > file       将输出重定向到 file. command < file       将输入重定向到 file. command >> file     将输出以追加的方式重定向到 file. n > file              将文件描述符为 n 的文件重定向到 file. n >> file             将文件描述符为 n 的文件以追加的方式重定向到 file. n >& m             

shell脚本学习-文件包含

跟着RUNOOB网站的教程学习的笔记 和其他语言一样,shell也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.shell文件包含的语法有两种形式 . filename  #也就是一个英文句号后面跟着想要包含的文件名,注意中间有一个空格分开 source filename 实验的时候遇到一个问题,第二种文件包含的形式在sh中不能用,而这两种文件包含形式在bash中是都可以使用的 实例 创建两个shell脚本文件 test1.sh代码如下: #!/bin/bash # a