shell基础编程

  • Shell变量:定义变量时,变量名不加美元符号($PHP语言中变量需要),如:

your_name="shenlancode.com"

注意:变量名和等号之间不能有空格

变量名命名规则:

  1. 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  2. 中间不能有空格,可以使用下划线(_)。
  3. 不能使用标点符号。
  4. 不能使用bash里的关键字(可用help命令查看保留关键字)。
  5. 有效的 Shell 变量名示例如下:

SHENLANCODE

           LD_LIBRARY_PATH

       _var

var2

  1. 无效的变量命名:

?var=123

User*name=shenlancode

  • 使用变量
  1. 使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

Your_name=”qinjx”

echo $your_name

echo ${your name}

 

(2) 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如

shell基础编程

加花括号是:

shell基础编程

如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

如图:

shell基础编程

注:推荐给所有变量加上花括号,这是个好的编程习惯。

3已定义的变量,可以被重新定义

      your_name=”tom”

      echo $your_name

      your_name=”alibaba”

      echo $your_name

这样写是合法的,但注意,第二次赋值的时候不能写$your_name=”alibaba”,使用变量的时候才加美元符$

  • 只读变量

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

myUrl=”http://www.w3cschool.com

readonly myUrl

  • 删除变量

 使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。实例

#!/bin/sh
myUrl="http://www.shenlancode.com"
unset myUrl
echo $myUrl

以上实例执行将没有任何输出。

  • 运行shell时,会同时存在三种变量:局部变量、环境变量、shell变量。
  • Shell字符串
  1. 获取字符串长度

   string=”abcd”

   echo ${#string}    #输出4

(2)提取子字符串

  string=”shenlancode is a great site”

  echo ${string:1:4}   #输出

shell基础编程

(3)拼接字符串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

运行结果如下:

shell基础编程

4)查找子字符串

查找字符“is”的位置

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

  • Shell数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0

1)定义数组:array=(1 2 3)

2)读取数组:echo ${array[0]}  输出数组的第一个元素

@

*

echo ${array[@]}  1 2 3   输出所有元素

echo ${array[*]}    1 2 3   输出所有元素

3)获取数组的长度

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

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

实例

#!/bin/bash
# author:教程
# url:www.shenlancode.com
my_array=(A B "C" D)
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D

Shell中以#代表注释

  • Shell传递参数

 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:

#!/bin/bash
echo "Shell 传递参数实例!"
echo "执行的文件名:$0"
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "第三个参数为:$3"

shell基础编程

#!/bin/bash
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3

url="http://www.shenlancode.com"

echo ${url#*string} #删除url中的string(实际的值)左侧的内容

echo ${url#*/}

$*[email protected]区别:

相同点:都是引用所有参数

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数1、2、3,则“*”

等价于“1 2 3”(传递了一个参数),而“@”等价于“1”“2”“3”(传递了三个参数)

#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
 echo $i
done
echo "-- \[email protected] 演示 ---"
for i in "[email protected]"; do
echo $i
done

执行脚本,输出结果如下所示:

shell基础编程

给自己写的文本文件加行号

shell基础编程

在进入file.txt后,行号已经加入了

shell基础编程

 

  • 运算

1shell中默认把变量值当作字符串

age=22

age=${age}+1

echo ${age}            #输出22+1

shell基础编程

2let命令使其进行数学运算

n=10

let n=$n+1

((n++))            #n在进行一次自加运算

echo $n           #输出12

shell基础编程

注:双括号(( )) ,支持c语言方式的代码  echo  $((2+3*5)) 

3原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk exprexpr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ')

#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
执行脚本,输出结果如下所示:
两数之和为 : 4
两点注意:
  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

4)算术运算符

赋值:a=$b  将把变量b的值赋给a

[ $a == $b ]  用于比较两个数字,相同则返回 true

[ $a != $b ]   用于比较两个数字,不相同则返回 true

注意:条件表达式要放在方括号之间,并且要有空格,例如[$a==$b] 是错误的,必须写成 [ $a == $b ]

                                                 

shell基础编程shell基础编程

结果如下:

shell基础编程

注意:

  • 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
  • if...then...fi 是条件语句,后续将会讲解。

MAC shell expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 如:echo  $((2+3*5)) 

5if的用法

 

运算符

说明

举例

-eq

检测两个数是否相等,相等返回 true

[ $a -eq $b ] 返回 false

-ne

检测两个数是否相等,不相等返回 true

[ $a -ne $b ] 返回 true

-gt

检测左边的数是否大于右边的,如果是,则返回 true

[ $a -gt $b ] 返回 false

-lt

检测左边的数是否小于右边的,如果是,则返回 true

[ $a -lt $b ] 返回 true

-ge

检测左边的数是否大于等于右边的,如果是,则返回 true

[ $a -ge $b ] 返回 false

-le

检测左边的数是否小于等于右边的,如果是,则返回 true

[ $a -le $b ] 返回 true

 

shell基础编程

P26文件测试运算符

(6) 显示转义字符

echo "\"It is a test\""

结果将是:

"It is a test"

shell基础编程

P28页有问题,问老师

(7).显示换行

-e   开启转义

shell基础编程

 

(8)显示不换行

shell基础编程

   (9) 原样输出字符串,不进行转义或取变量(用单引号)

echo '$name\"'

shell基础编程

shell基础编程

 

 

echo输出的字符串总结

 

 

符号

能否引用变量

能否引用转移符

能否引用文本格式符(如:换行符、制表符)

单引号

双引号

无引号

 

Read命令一个一个词组地接收输入的参数,每个词组需要使用空格进行分隔;如果输入的词组个数大于需要的参数个数,则多出的词组将作为整体为最后一个参数接收。

测试文件test.sh代码如下:

read firstStr secondStr

echo "第一个参数:$firstStr; 第二个参数:$secondStr"

执行测试:

$ sh test.sh

第一个参数:; 第二个参数:

实例, 文件 test.sh:

read -p "请输入一段文字:" -n 6 -t 5 -s password

echo "\npassword is $password"

参数说明:

  •  -p 输入提示文字
  •  -n 输入字符长度限制(达到6位,自动结束)
  •  -t 输入限时
  •  -s 隐藏输入内容

$ sh test.sh

请输入一段文字:

password is asdfgh