Shell脚本入门 [I.变量]

Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell脚本(shell script),是一种为Shell编写的脚本程序。

Shell 环境

Shell编程只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。常见的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)

一般在第一行需要指定解释器信息,#! 标记 用于指定脚本执行的解释器。

#!/bin/bash
echo "Hello World !"
代码第一行表示这个脚本是 Bourne Again Shell,用此脚本的解释器运行
  • 运行脚本的方式有两种
    1)作为可执行程序
    上面输出"Hello World !"的脚本程序,将其命名为test.sh,cd到test.sh文件的目录
    # 获取脚本文件的执行权限
    # Unix和Linux系统每个文件(文件夹也被看作是文件)都按读、写、运行设定权限
    # 读、写、运行三项权限用数字表示:Read(r=4),Write(w=2),eXecute(x=1)
    # 7=r+w+x,表示同时设置读、写、运行的权限
    # 一般chmod同时设置文件的三种角色的权限:文件拥有者权限、拥有者所在用户组成员权限和其他用户权限
    # chmod 755 test.sh 表示设置拥有者有读写运行权限,用户组成员和其他用户只有读和运行的权限
    chmod 755 test.sh
    # 执行脚本。执行的结果是在终端打印 Hello World !
    ./test.sh  
    
    2)作为解释器参数
    这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名。这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
    /bin/sh test.sh         # 运行Bourbon Shell脚本
    /usr/bin/csh test.csh   # 运行C Shell脚本
    

Shell 变量

定义变量时,变量名不加美元符号,使用定义过的变量需要在变量名前面加美元符号($) 。shell是弱类型语言,所以定义时不需要使用类型限定,并且变量可以修改类型(重新定义),如下定义了一个字符串类型的str变量,之后修改为数值类型。
注意:变量等号两边不能有空格出现

str="string" # 定义字符串类型的变量
echo $str    # 打印变量,使用变量时在前面加 $ 符号
echo ${str}  # 使用变量时加花括号(可选),帮助解释器识别变量边界
str=123      # 重新定义,定义值为123的数值类型变量
echo $str
输出结果:
string
string
123

使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。

#!/bin/bash
var1="只读变量"
readonly var1

使用unset命令可以删除变量,变量被删除后不能再次使用。unset命令不能删除只读变量。

#!/bin/bash
var1="这是一个变量"
unset var1
echo ${var1}  # var1变量已被删除,这句不会有任何输出

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

Shell 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
str='this is a string'

双引号

  • 双引号里可以有变量;
  • 双引号里可以出现转义字符.
str1='Shell'
str2="very nice"
str3="${str1} is a code language ! \"$str2\"."
echo $str3
echo hello world ! # 不加引号直接使用字符串

输出:
Shell is a code language ! "very nice".
hello world !

拼接字符串

nameVal="Jason"
# 使用双引号拼接
greeting="hello, "$nameVal" !"
greeting_1="hello, ${nameVal} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$nameVal' !'
greeting_3='hello, ${nameVal} !'
echo $greeting_2  $greeting_3
输出结果:
hello, Jason ! hello, Jason !
hello, Jason ! hello, ${nameVal} !

获取字符串长度

string="abcd"
echo ${#string} # 输出 4

提取子字符串
以下实例从字符串第 2 个字符开始截取 5 个字符:

string="have a nice day !"
echo ${string:1:5}    # 输出 ave a

查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

注意: 以上脚本中`是反引号,而不是单引号'

Shell 数组

bash只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(数组的大小没有限制)。数组元素下标从0开始,获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
定义数组
用括号来表示数组,数组元素用"空格"符号分割开。语法格式如下:

数组名=(值1 值2 ... 值n)

# 空格分格 
array_name=("Jason" "Jack" "Rose" "Bob") 
 # 回车换行
array_city=(   
"Beijing"
"Shanghai"
"Hangzhou"
)
# 或者使用下标定义,单独定义数组的各个分量,可以不使用连续的下标,而且下标的范围没有限制。
array_country[0]="the People's Republic of China"
array_country[1]="America"
array_country[4]="England"

读取数组
读取数组元素值的一般格式是:

获取单个元素值:${数组名[下标]}
使用@或者*符号获取数组中的所有元素:${数组名[@]}

country4=${array_country[4]}
echo ${country4}
echo ${array_name[@]}
输出结果:
England
the People's Republic of China America England

获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同

# 取得数组元素的个数
array_length=${#array_country[@]}
# 或者
array_length1=${#array_country[*]}
# 取得数组单个元素的长度
length4=${#array_country[4]}
echo 'array_country length : '${array_length}' , '$array_length1'. the length of value index 4 is : '${length4}
输出结果:
array_country length : 3 , 3. the length of value index 4 is : 7

Shell 注释

单行注释以#开头,注释会被解释器忽略。
多行注释
1)可以用一对花括号括起来一段代码,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
2)多行注释可以使用一下格式:

格式一
:<<EOF
这里是一行注释内容
这里是一行注释内容
EOF

格式二,EOF也可以使用其他符号 
:<<'
这里是一行注释内容
这里是一行注释内容
'

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

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,367评论 0 5
  • 菜鸟教程shell在线编辑器大目录整理: 1.第一个 Shell 脚本尝试 2.Shell 变量 3.Shell ...
    中酷男阅读 5,418评论 0 12
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,720评论 0 10
  • 概念和原理 Shell是什么? Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。 Sh...
    陵无山阅读 3,530评论 0 27
  • 今天一过,所有的90后都成年了。 好多朋友都发朋友圈,各种各样,关乎于十八岁,还有,关于脱单。 说起脱单,我想起不...
    丸子不熟阅读 92评论 0 0