问题描述
shell脚本
shell语法
shell脚本的定义与执行
1、定义开头:#!/bin/bash
#!用来声明脚本由什么shell解是,否则使用默认shell
2、单个"#"号代表注释当前行
3、执行:
chmod + x test.sh ./test.sh 增加可执行权限后执行
bash test.sh 直接指定使用bash解是test.sh
. test.sh(source test.sh)使用当前 shell读取解是test.sh
三种执行脚本的方式不同点
./和bash执行过程基本一直,后者明确指定bash解释器去执行脚本,脚本中#!指定的解释器不起作用。前者首先检测#!,使用#!指定的shell,如果没有使用默认的shell用./和bash去执行会在后台启动一个新的shell去执行脚本。用.去执行脚本不会启动新的shell,直接由当前的shell去执行脚本。
自定义变量
定义变量:
- 变量=变量值
引用变量:
- $变量名
显示变量:
- 使用echo命令可以显示单个变量的取值
清除变量:
- 使用unset命令清除变量
变量的其他用法:
- read string :从键盘输入一个字符串赋给变量string
- readonly var=100:定义一个只读变量,只能在定义时初始化,以后不能改变,不能被清除。
- export var=300:使用export说明的变量,会被导出为环境变量,其他shell均可使用
注意:此时必须使用source var.sh才可以生效
注意事项:
1、变量名只能包含英文字母下划线,不能以数字开头
2、shell脚本中,赋值操作时不能在等号两边加空格
环境变量
显示环境变量:使用env命令可以查看所有环境变量。
清除环境变量:使用unset清除环境变量
设置环境变量:
方法1:临时设置
在终端执行命令
MYVAL=999
export MYVAL
方法2:永久设置
需要在配置文件中进行设置即可,设置完毕后需要通过source命令,配置文件才可生效
预设变量
$#: 传给shell脚本的参数个数
$*: 传给shell脚本参数的内容
$1,$2,$3,$4,...,$9: 运行脚本时传递给其的参数,用空格隔开
$?: 命令执行后返回的状态。用于检查上一个执行是否正确(在linux中,命令退出状态为0标识该命令正确,任何非零值标识命令出错)
$0: 当前执行的进程名
$$: 当前进程的进程号
脚本变量的特殊用法
""(双引号):包含的变量会被解释
''(但引号):包含的变量会当作字符串解释
``: 反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量
$echo "today si `date`"
\转义字符:同C语言\n \t \r \a等echo命令需加-e转义
(命令序列):由子shell来完成,不影响当前shell中的命令
{命令序列}:在当前shell中执行,会影响当前变量
条件测试时语句
test:用于测试字符串、文件状态和数字
test命令有两种格式:
test condition 或 [condition]
使用方括号时,要注意在条件两边加上空格
shell脚本中的条件测试如下:
文件测试、字符串测试、数字测试、复合测试
-
文件测试:
(1)按照文件类型
-e 文件名 文件是否存在
-s 文件名 是否为非空
-b 文件名 块设备文件
-c 文件名 字符设备文件
-d 文件名 目录文件
-f 文件名 普通文件
-L 文件名 软连接文件
-S 文件名 套接字文件
-p 文件名 管道文件
(2)按照文件权限
-r 文件名 可读
-w 文件名 可写
-x 文件名 可执行
(3)两个文件之间的比较
文件1 -nt 文件2 文件1的修改时间是否比文件2新
文件1 -ot 文件2 文件1的修改时间是否比文件2旧
文件1 -ef 文件2 两个文件的inode节点号是否一样,用于判断是否是硬链接
#! /bin/bash echo "please input a filename >>> " read FIFE test -e $FILE echo "存在?$?" test -s $FILE echo "非空? $?" [ -r $FILE ] echo "可读? $?" [ -w $FILE ] echo "可写? $?" [-x $FILE ] echo "可执行? $?"
-
字符串
s1 = s2 测试连个字符串的内容是否完全一样
s1 != s2 测试连个字符串的内容是否有差异
-z s1 测试s1字符串的长度是否为0
-n s1 测试s1字符串的长度是否不为0
-
数字
a -eq b 测试a与b是否相等
a -ne b 测试a与b是否不相等
a -gt b 测试a是否大于等于b
a -lt b 测试a是否小于b
a -le b 测试a是否小于等于b
复合测试
&&:
command && command2
||:
command1 || command2
多重条件判定
选项 | 说明 |
---|---|
-o | (or)两条件任何一个成立:test -r file -o -x file |
-a | (and)两条件同时成立:test -r file -a -x file |
! | 相反状态:test ! -x file |
控制语句
格式一:
if [ 条件1 ];then
执行第一段程序
else
执行第二段程序
fi
格式二:
if [ 条件1 ];then
执行第一段程序
elif [ 条件2 ];then
执行第二段程序
else
执行第三段程序
fi
case 控制语句
case $变量名称 in
"第一个变量内容" )
程序段一
;;
"第二个变量内容" )
程序段二
;;
*)
其他程序段
exit 1
esac
for控制语句
形式一:
for (( 初始值; 限制值; 执行步阶))
do
程序段
done
初始值: 变量在循环中的起始值
限制值: 当变量值在这个限制范围内时,旧继续进行循环
执行不接: 每做有一次循环时, 变量的变化量
declare是bash的一个内建命令,可以用来声明shell变量、设置变量的属性。
declare 也可以写作typeset。
declare -i s 代表强制把s变量当作int型参数运算
#!/bin/bash
declare -i sum
for(( i=1; i<=100; i++))
do
sum=sum+i
done
echo "the result is $sum"
形式二:
for var in con1 con2 con3
do
程序段
done
while控制语句
while [ condition ]
do
程序段
done
declare -i i
declare -i s
while [ "$i" != "101"]
do
s+=i;
i=i+1;
done
echo "The count is $s"
until控制语句
until [ condition ]
do
程序段
done
这种方式与while相反,当条建不成立是才进入循环
break continue
break:允许跳出循环
continue:类似break,不会跳出循环,只是跳过这一步
函数
定义函数的两种格式:
格式一:
函数名()
{
命令
}
格式二:
function 函数名()
{
命令
}
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中,所有函数在使用前必须定义,必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用
#!/bin/bash
myfun()
{
echo "hello world"
echo "nihao beijing"
}
myfun
函数传参
myadd()
{
A=$1
B=$2
SUM=`expr $A + $B`
echo "$A + $B = $SUM"
}
myadd 100 200
num1=666
num2=777
myadd $num1 $num2
函数可以使用retuan 提前结束并带回返回值
myadd()
{
A=$1
B=$2
SUM=`expr $A + $B`
return $SUM
}
myadd 10 20
echo "$?"
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)