[原文链接(https://coderjeremy.github.io/2018/11/06/Shell脚本编程/)
Shell 是一个用C语言编写的程序,它既是一种命令语言,又是一种程序设计语言。
Shell脚本,用shell编写的脚本程序
.sh
为文件后缀的文件,hello.sh
#!/bin/bash
#注释
#author : jeremy
echo "Hello Shell !"
保存退出
3. 先赋予执行权限
# chmod a+x hello.sh
# ./hello.sh
variable_name=variable_value
等号左右无空格
ex:
User="Jeremy"
Pwd="123456"
使用美元符号$
访问变量,可以给变量加上{ }
花括号,帮助解释器识别变量的边界
#!/bin/sh
User="Jeremy"
Pwd=“123456”
echo $User
echo ${Pwd}
打印 User
和 Pwd
的值
使用readonly
可以将变量定义为只读变量,只读变量的值不能改变
#!/bin/sh
User="Jeremy"
readonly User
使用unset
命令可以删除变量
#!/bin/sh
User="Jeremy"
unset User
局部变量在脚本或命令中定义,仅在当前shell实例中有效
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证正常运行,shell脚本也可以定义环境变量
shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
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 expression求值,结果是true,statement被执行,否则不执行
if[ expression ]
then
Statement(s) to be executed if expression is true
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 [ 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 语句。和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命令进行计算。如果结果值是 true,给定语句被执行。如果命令为 false,那么没有语句将不执行,程序将跳转到done语句后的下一行。
while command
do
Statement(s) to be executed if command is true
done
var是一个变量,word1 到 wordN 是由空格分隔的字符(字)序列的名称。每次for 循环的执行,变量var的值被设置为下一个单词的列表中的字,word1 到 wordN 。
for var in word1 word2 ... wordN
do
Statement(s) to be executed if command is true
done
这里Shell命令进行评估计算。如果结果值是false,给定语句(s)被执行。如果命令没有语句为true,那么将不执行,程序会跳转到下一行done语句后。
until command
do
Statement(s) to be executed until command is true
done
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