Shell脚本基础
参考:Shell 变量 | 菜鸟教程 (runoob.com)
脚本如Build.sh
执行命令:./Build.sh
1.Shell 变量
如:your_name=“runoob”
注:
无效例子:
避免使用if作为变量名
if="some_value"
避免使用 $ 等特殊符号
variable_with_$=42
?var=123
user*name=runoob
避免空格
variable with space="value"
等号两侧避免使用空格:
正确的赋值
variable_name=value
有可能会导致错误
variable_name = value
除了显式地直接赋值,还可以用语句给变量赋值,如:
for file in `ls /etc`
或
for file in $(ls /etc)
以上语句将 /etc 下目录的文件名循环出来。
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name} //加花括号是为了帮助解释器识别变量的边界,推荐给所有变量加上花括号
只读变量
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com" //不会改变值
删除变量
unset variable_name //删除后不能再使用
环境变量
echo $PATH //例如,PATH 变量包含了操作系统搜索可执行文件的路径
特殊变量
有一些特殊变量在 Shell 中具有特殊含义,例如 $0表示脚本的名称,$1,$2, 等表示脚本的参数。$#表示传递给脚本的参数数量,$?表示上一个命令的退出状态等。
多行注释
: '
这是注释的部分。
可以有多行内容。
'
2.传递参数:
**PRG=“$0”**表示当前脚本路径
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为 $n,n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数。
例如可以使用 $1、$2 等来引用传递给脚本的参数,其中 $1 表示第一个参数,$2 表示第二个参数,依此类推。
例子:
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
执行脚本,输出:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
3.运算符:
#!/bin/bash
val=‘expr 2 + 2’ //必须有空格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。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
4.echo命令
显示命令执行结果
echo `date` // 这里使用的是反引号 `, 而不是单引号 '
结果:
Thu Jul 24 10:08:46 CST 2014
5.test测试命令选项
数值测试
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
if test $[num1] -eq $[num2]
文件测试
-e 文件名 | 如果文件存在则为真 |
---|---|
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
-h 测试文件是否是符号链接
6.流程控制
if 语句语法格式:
if condition
then //如果为真,执行then和else之间语句
command1
command2
...
commandN
fi //结束语句
写成一行(适用于终端命令提示符):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
if else 语法格式:
if condition
then //如果为真,执行then和else之间语句
command1
command2
...
commandN
else //如果条件为假,执行 else 和 fi 之间的命令
command
fi //结束语句
if else-if else 语法格式:
if condition1
then //如果条件1为真,执行 then 和 elif 之间的命令
command1
elif condition2 //如果条件1为假且条件2为真,执行 elif 和 else 之间的命令。
then
command2
else //如果条件1和条件2都为假,执行 else 和 fi 之间的命令。
commandN
fi
for循环
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
输出:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
while 语句
while condition
do
command
done