shell编程(一)入门hello world!-爱代码爱编程
目录
一.shell编程的历史
shell的历史是解释执行用户的命令,用户输入一条命令,shell就解释执行一条,这种方式称为交互式(Interactive),shell还有一种执行命令的方式 称为批处理
(Batch),用户事先写一个shell脚本(script),其中有很多流程控制语句 但shell脚本是解释执行的,不需要编译,shell程序从脚本中一行一行读取并执行这些命令,相当于用户把
脚本的命令一行一行敲到shell提示符下执行.
二.由于历史原因,unix系统上有很多种 shell:
1.sh(bourne shell)
2.csh
3.ksh
4.tcsh
5.bash
三.内建命令和小括号
Shell 内建命令,就是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件。
type 来确定一个命令是否是内建命令
不加小括号,改变当前工作目录
加小括号,不改变当前工作目录
四.基本语法
变量
按照惯例,shell变量通常由字母加下划线开头,由任意长度的字母,数字下划线组成.有两种类型的shell变量:
1.环境变量
环境变量可以从父进程传递给子进程,因此shell变量可以从当前shell进程传给fork出来的子进程.用printenv命令可以显示当前shell进程的环境变量
2.本地变量
只存在于当前shell进程,用set命令显示当前shell进程中定义的所有变量(包括本地变量和环境变量)和函数
环境变量是任何进程都有的概念,而本地变量是shell特有的概念
在环境变量和本地变量的定义和用法相似.在shell中定义或赋值一个变量:
1.只有String类型
2.变量 环境变量和本地变量
环境变量======相当于c语言中的全局变量
本地变量======相当于c语言中的局部变量
3.
var =hello
变量名=变量值
echo $var ===取变量值
export var 将本地变量改为环境变量
unset 命令可以删除已定义的环境变量
unset VARNAME
04通配符
文件名代换(globbing)
这些用于匹配的字符串称为通配符(wildcard),如:*? [] 具体如下:
* 匹配0个或多个任意字符
? 匹配一个任意字符
[ ] 匹配方括号中任意一个字符的一次出现
注意,globbing 所匹配的文件名是由shell展开的,也就是说在参数 还没传给程序之前就已经展开,比如上述ls
cho[012].doc 如果当前目录下有cho0.doc和cho1.doc则传递给ls命令的参数实际上是这两个文件名,而不是匹配字符串
3. 命令代换
由" "反引号括起来的也是一条命令,shell先执行该命令,然后将输出结果立即带换到当前命令行中,例如
定义一个变量存放date命令的输出:
Date ="date"
echo $Date
命令代换也可以用$()表示
$(date)
4.算数代换
使用$(()) ,用于算术计算,(())中的shell变量取值将转成整数同样的含义$[]等价,例如:
VAR=45;
echo $(($VAR+3)) 等价于echo $[VAR+3]或$[$VAR+3]
$(())中只能用于+-*/和()运算符,并只能做整数运算
$[base#n],其中base表示进制,n按照base进制解释,后面再有运算数按十进制解释
5.转义字符
和 c语言类似,\在shell中被用作转义字符,用于除去紧跟其身后的单个字符的意义(回车除外),换句话说,紧跟其后的字符取字面值.
6.单引号
和c语言相同,shell脚本中的单引号和双引号都是字符中的界定符,而不是字符的界定符,单引号用于保持引号内所有字符的字面值,即使引号内的\和
回车也不能出现单引号
7.双引号
被双引号括住的内容,将被视为单一字串.他防止通配符扩展但允许变量扩展.
五. shell脚本语法
1.条件测试
命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit status为0,
如果测试结果为假,则该命令的Exit Status为1
(注意与c语言的逻辑正好相反)
虽然看起来很奇怪,但左括号[确实是一个命令的名字,传给命令的各个参数之间应该用空格隔开,如:
[ -d DIR ] 如果DIR存在并且是一个目录则为真
[-f file ] 如果file存在且是一个普通文件
[- z string] 如果string的长度为0则为真
[- n string] 如果string的长度不为零则为真
[string1 =string2] 如果string的长度不为零则为真
[string1!=string2] 如果两个字符串不相同则为真
[arg1 op arg2] arg1和arg2应该是整数或者取值为整数的变量
op是 -eq 等于
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
之中的一个
作为一个好的shell编程习惯,应该总是把变量取值放在双引号之中
2.分支 if/then/elif/else/fi
和c语言类似,在shell中if,then,elif,else,fi这几条命令实现分支控制.这种流程控制语句本质上也是由若干shell命令组成的
例如:
实验结果如下:
3.case/esac
case命令 可类比c语言的switch/case语句,esac表示case语句块的结束.c语言的case只能匹配整型或者字符型常量表达式,而
shell脚本的case可以匹配字符串和wildCard,每个分支可以有若干个命令,末尾必须以;;结束.执行时找到第一个匹配的分支并执行相应的命令
然后直接跳到esac之后,不需要像c语言一样用break跳出循环
例子:
4.循环
for/do/done
shell脚本的for循环结构和c语言的for循环结构不一样,他类似于某些编程语言的foreach循环.例如:
fruit是一个循环变量,第一次循环$fruit的取值是apple,第二次取值是banana,第三次取值是pear
例子2.将当前目录下的chap0.chap1,chap2等文件名改成 chap~,chap1~,chap2~(按照惯例,末尾有~字符的文件名表示临时文件)
break和contonue
break[n]可以指定跳出几层循环
continue跳出本次循环,但不会跳出循环
即break 跳出,contine跳过
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_42369687/article/details/111084552