Shell 变量

界说变量时,变量名不加美圆标记($,PHP说话中变量须要),如:

your_name="xfitphysio.com"

注重,变量名和等号之间不能有空格,这能够和你熟习的一切编程说话都不一样。同时,变量名的定名须遵守以下法则:

  • 定名只能操纵英笔墨母,数字和下划线,首个字符不能以数字开首。
  • 中心不能有空格,能够操纵下划线(_)。
  • 不能操纵标点标记。
  • 不能操纵bash里的关头字(可用help号令检查保留关头字)。

有效的 Shell 变量名示例以下:

jishudaxue
LD_LIBRARY_PATH
_var
var2

有效的变量定名:

?var=123
user*name=jishudaxue

除显式地间接赋值,还能够用语句给变量赋值,如:

for file in `ls /etc`
或
for file in $(ls /etc)

以上语句将 /etc 下目次的文件名轮回出来。


操纵变量

操纵一个界说过的变量,只需在变量名后面加美圆标记便可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名里面的花括号是可选的,加不加都行,加花括号是为了赞助诠释器辨认变量的边境,比以上面这类情况:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

若是不给skill变量加花括号,写成echo "I am good at $skillScript",诠释器就会把$skillScript当做一个变量(其值为空),代码履行成果就不是咱们希冀的模样了。

保举给一切变量加上花括号,这是个好的编程习气。

已界说的变量,能够被从头界说,如:

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

如许写是正当的,但注重,第二次赋值的时辰不能写$your_name="alibaba",操纵变量的时辰才加美圆符($)。

只读变量

操纵 readonly 号令能够将变量界说为只读变量,只读变量的值不能被转变。

上面的例子测验考试变动只读变量,成果报错:

#!/bin/bash
myUrl="//www.google.com"
readonly myUrl
myUrl="//xfitphysio.com"

运转剧本,成果以下:

/bin/sh: NAME: This variable is read only.

删除变量

操纵 unset 号令能够删除变量。语法:

unset variable_name

变量被删除后不能再次操纵。unset 号令不能删除只读变量。

实例

#!/bin/sh
myUrl="//xfitphysio.com"
unset myUrl
echo $myUrl

以上实例履行将不任何输入。

变量范例

运转shell时,会同时存在三种变量:

  • 1) 部分变量 部分变量在剧本或号令中界说,仅在以后shell实例中有效,其余shell启动的法式不能拜候部分变量。
  • 2) 情况变量 一切的法式,包含shell启动的法式,都能拜候情况变量,有些法式须要情况变量来保障其普通运转。须要的时辰shell剧本也能够界说情况变量。
  • 3) shell变量 shell变量是由shell法式设置的特别变量。shell变量中有一部分是情况变量,有一部分是部分变量,这些变量保障了shell的普通运转

Shell 字符串

字符串是shell编程中最经常操纵最有效的数据范例(除数字和字符串,也没啥别的范例好用了),字符串能够用单引号,也能够用双引号,也能够不必引号。单双引号的区分跟PHP近似。

单引号

str='this is a string'

单引号字符串的限定:

  • 单引号里的任何字符城市原样输入,单引号字符串中的变量是有效的;
  • 单引号字串中不能呈现零丁一个的单引号(对单引号操纵本义符后也不行),但可成对呈现,作为字符串拼接操纵。

双引号

your_name='jishudaxue'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

输入成果为:

Hello, I know you are "jishudaxue"! 

双引号的长处:

  • 双引号里能够有变量
  • 双引号里能够呈现本义字符

拼接字符串

your_name="jishudaxue"
# 操纵双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 操纵单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输入成果为:

hello, jishudaxue ! hello, jishudaxue !
hello, jishudaxue ! hello, ${your_name} !

获得字符串长度

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

提取子字符串

以下实例从字符串第 2 个字符起头截取 4 个字符:

string="jishudaxue is a great site"
echo ${string:1:4} # 输入 unoo

注重:第一个字符的索引值为 0

查找子字符串

查找字符 io 的地位(哪一个字母先呈现就计较哪一个):

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

注重: 以上剧本中 ` 是反引号,而不是单引号 ',不要看错了哦。


Shell 数组

bash撑持一维数组(不撑持多维数组),并且不限定命组的巨细。

近似于 C 说话,数组元素的下标由 0 起头编号。获得数组中的元素要操纵下标,下标能够是整数或算术抒发式,其值应大于或即是 0。

界说数组

在 Shell 中,用括号来表现数组,数组元素用"空格"标记朋分开。界说数组的普通情势为:

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

比方:

array_name=(value0 value1 value2 value3)

array_name=(
value0
value1
value2
value3
)

还能够零丁界说数组的各个份量:

array_name0=value0
array_name1=value1
array_namen=valuen

能够不操纵持续的下标,并且下标的规模不限定。

读取数组

读取数组元素值的普通格局是:

${数组名下标}

比方:

valuen=${array_namen}

操纵 @ 标记能够获得数组中的一切元素,比方:

echo ${array_name@}

获得数组的长度

获得数组长度的方式与获得字符串长度的方式不异,比方:

# 获得数组元素的个数
length=${#array_name@}
# 或
length=${#array_name*}
# 获得数组单个元素的长度
lengthn=${#array_namen}

Shell 正文

# 开首的行便是正文,会被诠释器疏忽。

经由进程每行加一个 # 号设置多行正文,像如许:

#--------------------------------------------
# 这是一个正文
# author:【WEB手艺大学】教程
# site:xfitphysio.com
# slogan:学的不只是手艺,更是胡想!
#--------------------------------------------
##### 用户设置装备摆设区 起头 #####
#
#
# 这里能够增加剧本描写信息
# 
#
##### 用户设置装备摆设区 竣事  #####

若是在开辟进程中,碰到大段的代码须要姑且正文起来,过一下子又打消正文,怎样办呢?

每行加个#标记太吃力了,能够把这一段要正文的代码用一对花括号括起来,界说成一个函数,不处所挪用这个函数,这块代码就不会履行,到达了和正文一样的结果。

多行正文

多行正文还能够操纵以下格局:

:<

EOF 也能够操纵其余标记:

:<<'
正文内容...
正文内容...
正文内容...
'

:<