快速了解和学习Unix/Linux下Shell(三)

Tags: linux shell bash

这篇文章是快速了解和学习Unix/Linux下Shell的第三部分,前几部分参考:

  1. 快速了解和学习Unix/Linux下Shell(一)

  2. 快速了解和学习Unix/Linux下Shell(二)

一、注释

shell中当前行在符号“#”后面的内容是注释内容,解释器会忽略所有"#"后的内容。Shell中没有提供多行注释的方式,只能每一行加一个#号。如:

#--------------------------------------------
# 这是一个自动打ipa的脚本,基于webfrogs的ipa-build书写:
# https://github.com/webfrogs/xcode_shell/blob/master/ipa-build
#--------------------------------------------

##### 用户配置区 开始 #####
#
# 项目根目录,推荐将此脚本放在项目的根目录,这里就不用改了
# 应用名,确保和Xcode里Product下的target_name.app名字一致
#
##### 用户配置区 结束  #####

如果在开发过程中,会遇到大段代码需要临时注释用于调试,这时在每行上加#符号非常麻烦,可以采用定义函数的方式,用花括号将需要注释的内容括起来,并起一个函数名如 comment_1,这个函数在shell脚本中没有被调用,因此也不会执行,可以变相达到注释的效果。

二、字符串

符串是shell编程中主要的数据类型,实际上shell中主要处理的及时字符串。字符串的定义:可以用单引号['],也可以用双引号["],也可以不用引号。单引号和双引号字符串是有区别的。

单引号:单引号字符串内的字符不会被转义,按照原始字符串输出。单引号中的字符串不能出现单引号,转义后的也不行。

str='this is a string'

双引号:双引号字符串内可以有变量,也可以有转义字符。

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"

1. 字符串拼接

字符串拼接的方式可以参考以下代码示例:

your_name="fourbyte"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"

echo $greeting $greeting_1

2. 获取字符串长度

使用${#str}可以获得字符串长度

string="abcde"
echo ${#string} #输出 5

3. 提取子字符串

使用类似数组切片的方式(参考: python数组和字符串),可以取得字符串的子串。

string="hello my friend"
echo ${string:1:4} #输出ello

4. 搜索字符串

搜索字符串是使用Linux的expr命令,使用方式为 expr index "$string_will_search"  str_to_search,参考下面示例:

string="abcdef"
echo `expr index "$string" def` #输出4

三、Shell数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号,可以不使用连续的下标,而且下标的范围没有限制。。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

1. 定义数组

在Shell中,用括号()来定义数组,数组元素用“空白”(这里的空白包含\n \t 和空格)分割。定义数组的一般形式为:
    array_name=(value1 ... valuen)
下面是三种不同的定义方式:

array_a=(value0 value1 value2 value3)
array_b=(
    value0
    value1
    value2
    value3
)
array_c[0]=value0
array_c[1]=value1
array_c[2]=value2

2. 读取数组

使用 ${array_name[index]}这种格式来获取数组的元素,如:

value=${array[0]}

参考下例:

#!/bin/sh
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"

结果:

$./test.sh
First Index: Zara
Second Index: Qadir

使用@ 或 * 可以获取数组中的所有元素,例如:

${array_name[*]}
${array_name[@]}

示例:

#!/bin/sh
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"

结果:

$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy

3. 获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

四、echo命令

echo是Shell的一个内部指令,用于在屏幕上显示信息,可以使用echo实现复杂的输出控制。echo的格式如下:

echo arg

注意:当字符串为单引号字符串时会显示原始字符串,因此下面例子中的命令均是双引号字符串。

1. 使用转义字符

如:

echo "\"It is \t a test\""

将显示:

"It is      a test"

2. 显示变量

直接在字符串中使用$var即可输出变量,如果变量与其它字符相连的话,需要使用大括号{ }括住变量:

name="fourbyte"
year="2014"
echo "$name is a technique site"
echo "the date is ${year}-11-2"

将显示:

fourbyte is a technique site
the date is 2014-11-2

3. 使用转义字符

使用\n显示换行,使用\c不换行,如:

echo -e "this is a new line\n"

将输出:

this is a new line

#上面多一空行,是由\n产生的

如:

echo -e "we are in \c"
echo -e "same line“

将输出:

we are in same line

4. 输出重定向

使用>可将输出重定向到文件,如:

echo "It is a test" > test.txt

将会在当前目录产生test.txt文件,他的内容是:

It is a test

5、输出命令执行结果

使用··括住的字符串时,echo会将该字符串理解为系统命令或程序尝试执行并获取返回结果并显示,如:

echo `date`

以上会显示当前日期,但如果字符串所代表的命令不存在,则会提示命令不存在错误,如:

echo `dateee`

会得到以下结果:

-bash: dateee: command not found

本文链接:http://www.4byte.cn/learning/119985/kuai-su-liao-jie-he-xue-xi-unix-linux-xia-shell-san.html