Shell编程基础(一)

Shell脚本编程基础


shell概念:

shell是一个用C语言编写的程序,他是用户使用Linux的桥梁,它是一种命令语言,同事也是一种编程语言.用户可以通过Shell访问操作系统和内核服务.Linux的Shell种类众多,Bash是大多数Linux系统默认的Shell,所以我以Bash为例学习shell脚本编程.


shell变量:

变量的命名

  1. 命名只能使用,字母/数字/下划线
  2. 中间不能有空格
  3. 不能使用标点符号
  4. 不能与关键字重合

变量操作

  1. 使用: $变量名 或者 ${变量名}
#!/bin/bash            # 表示为bash的shell  也可以写成#!/bin/sh
a=4
b=5
c=`expr $a + $b`
echo $c
  1. 设置只读变量: 变量名 readonly
  2. 删除变量: unset 变量名
  3. 变量的赋值用'=',需要注意的是等号两边不要有空格,比如a=1是对的,但是a = 1或a= 1都是错的,'command not found'

变量的分类

  1. 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

特殊变量
有些变量是一开始执行脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个后台程序的PID
$? 执行上一个指令的返回值


shell中常用数据类型

  1. 字符串:
  • 可以使用单引号也可以使用双引号,单引号表示原样字符串,单引号中变量或者转义符都会无效,单引号里也不能出现单引号;
  • 提取字符串长度 ${#变量名}
  • 字符串切片 ${变量名:开始位置:结束位置}

str1='abc'
str2="$str1"
str3='$str1'
echo $str1 $str2 $str3 #输出abc abc $str1
echo ${#str1} #输出3
echo ${str1:1:2} #输出bc 开始位置1 结束位置2 编程语言中一般都是以0是开始的

  1. 数组:
  • 数组的定义: 变量名=(值1 值2... 值n)
  • 数组的读取: ${变量名[下标]} 或 取所有元素用${变量名[@]}
  • 数组的长度: ${#变量名}

array1=(1 3 5 7 9) #注意数组中每个值用空格隔开而不是逗号
echo $array1 #输出1 默认下标0
echo ${array[4]} #输出9
echo ${array1[@]} #输出1 3 5 7 9
echo ${#array1[@]} #输出5
echo ${#array1} # 输出1 取的是单个元素 默认的下标是0 单个元素长度为1

  1. 注释:
  • 以#开头的就是注释,会被解释器直接忽略

shell传参

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程PID号
$! 后台运行的最后一个进程的PID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

shell运算符

  • 由于原生bash不支持简单的数学运算,但是可以通过其他命令实现,例如awk/expr,其中expr最常用,expr是一款表达式计算工具,使用时要用撇号`包起来(撇号就是键盘上1左边的那个),而且需要注意的是它有严格的语法规范,表达式与运算符之间一定要有空格!例如`expr $a + $b`是对的,但是`expr $a+$b`是错误的!
  1. 算数运算符:
运算符 说明 举例
+ 加法 `expr $a + $b`
- 减法 `expr $a - $b`
* 乘法 `expr $a * $b`
/ 整除法 `expr $a / $b` 如`expr 8 / 3`结果为2
% 取余 `expr $a % $b`
= 赋值 a=$b
== 相等 $a == $b 判断是否相等 相等返回true 不相等返回false
!= 不相等 $a != $b 相等返回false 不相等返回true

  1. 关系运算符
    关系运算符只支持数字,不支持字符串,除非字符串的值是数字.
运算符 说明
-eq 检测两个数是否相等,相等返回true
-ne 检测两个数是否不等于,不等返回true
-gt 检测左边的数是否大于右边的,是就返回true
-lt 检测左边的数是否小于右边的,是就返回true
-ge 检测左边的数是否大于等于右边的,是就返回true
-le 检测左边的数是否小于等于右边的,是就返回true
  1. 布尔运算:

! : 非运算符,[!true] 返回false
-o: 或运算符,任一true 返回true
-a: 与运算符,任一为false 返回false

  1. 逻辑运算符:

&& 逻辑的AND
|| 逻辑的OR

  1. 字符串运算符

= 检测两个字符串是否相等,相等返回 true
!= 检测两个字符串是否相等,不相等返回 true
-z 检测字符串长度是否为0,为0返回 true
-n 检测字符串长度是否为0,不为0返回 true
str 检测字符串是否为空,不为空返回 true 举例 a='abc' [$a]返回ture


shell命令

  1. shell echo命令: 用于字符串的输出
  • echo abc 和 echo "abc" 是一样的

  • 可以显示普通字符串\转义字符\变量

echo "Hello world" #返回Hello world
text="Hello world"
echo $text #返回Hello world
echo "Hello world"#返回"Hello world"

  • 可以定向至文件
    echo "Hello world" > test.log 会将"Hello world"定向输出到test.log中

  • 可以显示命令执行结果
    echo `data` #注意是撇号,结果将显示目前的日期
    echo `expr 2 + 3` #执行结果5

  1. shell printf命令:
  • 可以格式化字符串输出 格式替代符(%s %c %d %f)
  • 可以转义序列
\a 警告字符
\b 后退
\c 抑制,结尾不换行且后面的格式字符串中的字符都会被忽略
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ 一个 \
  1. shell test命令:
    test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。格式为 test 条件语句
  • 测试字符串

test str1==str2 测试两个字符串是否相同
test str1 !=str2 测试两个字符串是否不同
test str1 测试是否为字符创
test -n str1或test -z str1 测试是否为空的字符串

  • 测试整数

test int1 -eq int2 测试是否相等
test int1 -ne int2 测试是否不等
test int1 -le int2 测试是否小于等于
test int1 -lt int2 测试是否小于
test int1 -ge int2 测试是否大于等于
test int1 -gt int2 测试是否大于

  • 测试文件

test -d file 测试是否为目录
test -f file 测试是否为文件
test -x file 测试是否是可执行文件
test -r file 测试是否是可读文件
test -w file 测试是否是可写文件
test -e file 测试文件是否存在
test -s file 测试文件是否为空
可简写 如 test -x file 可简写为 [ -x file ] 注意中括号旁一定加空格把执行命令括起来


shell 循环与分支

  1. 分支: if 和 if else 和 if elif else
if 条件语句
then
    条件为真执行语句
fi
也可以这样写为一行:if 条件语句; then 条件为真执行语句;fi   
下面同理要么换行要么用';'

if 条件语句
then 
    条件为真执行语句
else
    条件为假执行语句
fi

if 条件1语句
then
    条件1为真执行语句
elif 条件2语句
then
    条件2为真执行语句
else
    条件1与条件2都为假执行语句
fi
  1. 循环语句: for循环 while循环 until循环 case循环
    跳出循环break 跳出本次循环 continue
举例说明:返回0到100的整数和
#! /bin/bash
sum=0
for ((i=0; i<=100; i++))
do
    sum=`expr $sum + $i`
done
echo $sum  #返回5050

#! /bin/bash
i=0
while(($i<=3))
do
    echo $i
    let "i++"
done
运行脚本,输出:
0
1
2
3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,381评论 0 5
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,725评论 3 70
  • 基础 头文件 #!/bin/bash 或者#!/bin/sh #!约定的标记,如IOS的Import 执行文件时需...
    ZMJun阅读 1,232评论 1 2
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,149评论 0 13
  • 清水无香LY阅读 209评论 0 2