脚本编程

[原文链接(https://coderjeremy.github.io/2018/11/06/Shell脚本编程/)

Shell

Shell 是一个用C语言编写的程序,它既是一种命令语言,又是一种程序设计语言。

Shell Script

Shell脚本,用shell编写的脚本程序

First Shell

  1. 创建一个.sh为文件后缀的文件,hello.sh
  2. 内容如下
#!/bin/bash
#注释
#author : jeremy
echo "Hello Shell !"

保存退出
3. 先赋予执行权限

# chmod a+x hello.sh
  1. 执行
# ./hello.sh

变量

定义变量

variable_name=variable_value
等号左右无空格

ex:
User="Jeremy"
Pwd="123456"

访问变量

使用美元符号$访问变量,可以给变量加上{ }花括号,帮助解释器识别变量的边界

#!/bin/sh

User="Jeremy"
Pwd=“123456”
echo $User
echo ${Pwd}

打印 UserPwd 的值

只读变量

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

#!/bin/sh

User="Jeremy"
readonly User

删除变量

使用unset命令可以删除变量

#!/bin/sh

User="Jeremy"
unset User

变量类型

局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效

环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证正常运行,shell脚本也可以定义环境变量

shell变量

shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

特殊变量

$0	当前脚本的文件名
$n	传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#	传递给脚本或函数的参数个数。
$*	传递给脚本或函数的所有参数。
$@	传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?	上个命令的退出状态,或函数的返回值。
$$	当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

数组Arrays

Bash Shell只支持一维数组,初始化时不需要定义数组大小

array_name=(value1...valueN)

定义数组

array_name[index]=value

ex:
User[0]="apple"
User[1]="banana"
User[2]="orange"

访问数组

和访问变量格式相同

${array_name[index]}
ex:
User[0]="apple"
User[1]="banana"
User[2]="orange"
echo ${User[0]}
echo ${User[@]}

以下两种方式可以访问数组中的所有项目
${array_name[*]}
${array_name[@]}

基本运算符

Bourne shell没有任何机制来执行简单的算术,它使用外部程序awk或expr

  • 运算符和表达式之间必须有空格
  • ` ` 倒逗号之间包含完整的表达式
#!/bin/sh

val=`expr 2 + 2`
echo $val

算术运算符

a=10
b=20

运算符说明举例
+加法` expr $a + $b ` 结果为 30。
-减法` expr $a - $b ` 结果为 -10。
*乘法` expr $a * $b ` 结果为 200。
/除法` expr $b / $a ` 结果为 2。
%取余` expr $b % $a ` 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等[ a = = a== a==b] 返回 false。
!=不相等[ a ! = a!= a!=b] 返回 true。

关系运算符

运算符说明举例
-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。

布尔运算符

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。

字符串运算符

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否为0,不为0返回 true。[ -n “$a” ] 返回 true。
str检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

Shell条件语句

if … fi

shell expression求值,结果是true,statement被执行,否则不执行

if[ expression ]
then
	Statement(s) to be executed if expression is true
fi

if … else … fi

if[ expression ]
then
	Statement(s) to be executed if expression is true
else
	Statement(s) to be executed if expression is not true
fi

if … elif … fi

if [ expression 1 ]
then
	Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
	Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
	Statement(s) to be executed if expression 3 is true
else
	Statement(s) to be executed if no expression is true
fi

case … esac

这里的字符串字每个模式进行比较,直到找到一个匹配。执行语句匹配模式。如果没有找到匹配,声明退出的情况下不执行任何动作。
没有最大数量的模式,但最小是一个。
当语句部分执行,命令;; 表明程序流程跳转到结束整个 case 语句。和C编程语言的 break 类似。

case word in
  pattern1)
     Statement(s) to be executed if pattern1 matches
     ;;
  pattern2)
     Statement(s) to be executed if pattern2 matches
     ;;
  pattern3)
     Statement(s) to be executed if pattern3 matches
     ;;
esac

Shell循环类型

while 循环

这里Shell命令进行计算。如果结果值是 true,给定语句被执行。如果命令为 false,那么没有语句将不执行,程序将跳转到done语句后的下一行。

while command
do
	Statement(s) to be executed if command is true
done

for 循环

var是一个变量,word1 到 wordN 是由空格分隔的字符(字)序列的名称。每次for 循环的执行,变量var的值被设置为下一个单词的列表中的字,word1 到 wordN 。

for var in word1 word2 ... wordN
do
	Statement(s) to be executed if command is true
done

until 循环

这里Shell命令进行评估计算。如果结果值是false,给定语句(s)被执行。如果命令没有语句为true,那么将不执行,程序会跳转到下一行done语句后。

until command
do
   Statement(s) to be executed until command is true
done

select 循环

var是一个变量,word1 到 wordN是由空格分隔的字符(字)序列的名称。每次for循环的执行,变量var的值被设置为下一个单词的列表中的字,由 word1 到wordN。

对于每一个选择的一组命令将被执行,在循环中。这个循环在ksh,并已被改编成的bash。这不是在sh。

select var in word1 word2 ... wordN
do
   Statement(s) to be executed for every word.
done
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值