文章目录
1. 变量说明
test -z $1
是一个判断表达式,用于判断$1
的值是否为空字符串。
若为空,则结果为true;否则为false。
可参考:https://www.cnblogs.com/tankblog/p/6160808.html
常用的 shell 中带有$符号的几个变量的含义:
区别:@ *
相同点:都是引用所有参数
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数(分别存储在1 2 3)则 *
等价于 1 2 3
(传递了一个参数);而 @
等价于 “1” “2” “3”(传递了三个参数)
默认情况下,echo 关闭了对转义字符的解释,添加 -e
参数可打开 echo 对转义字符的解释功能。-E
关闭转义字符,是默认值。
$$ --Shell本身的PID(ProcessID)
$! --Shell最后运行的后台Process的PID
$? --最后运行的命令的结束代码(返回值)
$- --使用Set命令设定的Flag一览
$* --所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ --所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$# --添加到Shell的参数个数
$0 --Shell本身的文件名
$1~$n --添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
$()是将括号内命令的执行结果赋值给变量:
[heheda@localhost ~]$ ls
a.sh data.sh results.txt
#将命令 ls 赋值给变量 a
[heheda@localhost ~]$ a=$(ls)
[heheda@localhost ~]$ echo $a
a.sh data.sh results.txt
${} 是用来作变量替换。一般情况下,$var 与 ${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围:
[heheda@localhost ~]$ A=B
#目的想打印变量A,然后再加上一个B,结果返回无。
[heheda@localhost ~]$ echo $AB
#此时,${ }可以较为精确的确定变量的范围
[heheda@localhost ~]$ echo ${A}B
BB
${ } 的一些特殊功能:
假设定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个/及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个/及其左边的字符串:my.file.txt
${file#*.}:删掉第一个.及其左边的字符串:file.txt
${file##*.}:删掉最后一个.及其左边的字符串:txt
${file%/*}:删掉最后一个/及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个/及其右边的字符串:(空值)
${file%.*}:删掉最后一个.及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个.及其右边的字符串:/dir1/dir2/dir3/my
示例:
#!/bin/bash
test -z $1
echo $?
saveDataPath=$1$2$3
if [ -e "${saveDataPath}" ];then
echo "${saveDataPath} exist!"
else
mkdir -p ${saveDataPath}
echo "Created successfully!"
fi
echo -e "
$$\n
$!\n
$-\n
$*\n
$@\n
$#\n
$0\n
$1 $2$3
"
2. mode=${1:-start}用法
解释:$1代表命令行输入的参数,如果$1存在且不为空,m就是$1,如果$1不存在或为空,那么m就是start
脚本实例:
#!/bin/bash
N=${1:-3}
echo "start hadoop-master container..."
i=1
while [ $i -lt $N ]
do
echo "start hadoop-slave$i container..."
i=$(( $i + 1 ))
done
注:当执行该脚本不加参数的时候N默认为3,当为5的时候则N为5
3. exit 0和exit 1有什么区别
当你 exit 0
的时候,在调用环境 echo \$?
就返回 0,也就是说调用环境就认为你的这个程序执行正确。
当你 exit 1
的时候,一般是出错定义这个 1,也可以是其他数字,很多系统程序这个错误编号是有约定的含义的。
但不为 0 就表示程序运行出错。 调用环境就可以根据这个返回值判断你这个程序运行是否ok。
如果你用脚本 a 调用脚本 b,要在 a 中判断 b 是否正常返回,就是根据 exit 0 or 1
来识别。执行完b后,判断 \$?
就是返回值
4. 定时清理日志脚本
vim logclean.sh
#!/bin/bash
time1="900"
while true
do
sudo echo "">nohup.out
sleep $time1
done
运行脚本命令:nohup sh ./logclean.sh &
5. 使用expect远程ssh服务器执行命令
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。网上大多数这样写:
#!/usr/bin/expect
set timeout 2
spawn ssh root@192.168.1.234
expect "*password*"
send "mypassword\r"
expect "*#"
send "mkdir hehe\r"
报错:
[root@TJY-HD-01 ldjsc]# sh ldjsc.sh
ldjsc.sh: line 3: spawn: command not found
couldn't read file "*password*": no such file or directory
ldjsc.sh: line 5: send: command not found
couldn't read file "*#": no such file or directory
ldjsc.sh: line 7: send: command not found
但我只有这样写才好使:
#!/bin/bash
/usr/bin/expect <<EOF
set timeout 150
spawn ssh root@192.168.1.234
expect {
"*yes/no" { send "yes\r" }
"*password:" { send "123456\r" }
}
expect "*#"
send "java -cp /mnt/huiq/flink-insert-hbase-jar-with-dependencies.jar com.huiq.bigdata.online.HiveInsertMysql\r"
expect eof
EOF
复杂些:
#!/bin/bash
/usr/bin/expect <<EOF
set timeout 2
spawn ssh root@192.168.1.234
expect {
"*yes/no" { send "yes\r" }
"*password:" { send "mypassword\r" }
}
expect "*#"
send "su - omm\r"
expect "*Last login*"
send "source /opt/huawei/Bigdata/mppdb/.mppdbgs_profile\r"
send "gsql -d gxbf -p 25308 -U haha -W heheda\r"
expect "*gxbf=>*"
send "CREATE SCHEMA data_yuan;\r"
expect eof
EOF
注:如果没有expect命令,先安装yum install -y expect
expect常用命令总结:
spawn 交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间
6. 调用数据库的存储过程
#!/bin/bash
source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile
for((i=201800;i<=202006;i++));
do
if [ $i -gt 201812 ] && [ $i -lt 201901 ]
then
z="${i:0:4}-${i:4:6}-01"
echo "$z不是日期,不做处理-->"
elif [ $i -gt 201912 ] && [ $i -lt 202001 ]
then
z="${i:0:4}-${i:4:6}-01"
echo "$z不是日期,不做处理-->"
else
z="${i:0:4}-${i:4:6}-01"
echo "生成的日期为$z,可以执行存储过程-->"
gsql -d hehe -p 110 -U xiaoqiang -W heheda <<EOF
call xiaoqiang.t_qianmingsheji('$z');
EOF
fi
done
注:
等于 -eq
大于 -gt (greater than)
小于 -lt (less than)
大于或等于 -ge (greater than or equal)
小于或等于 -le (less than or equal)
不相等 -ne (not equal)
Shell字符串截取方法:
假设现在有字符串var=http://www.baidu.com
# 和 ## 号截取字符串(删左边留右边)
${var#*string}
解释:从左边开始,删除第一个string以及左边的所有字符。var为变量名,#表示截取的运算符。
举例:echo ${var#*.}
结果:baidu.com
${var##*string}
解释:从左边开始,删除最后一个string以及左边的所有内容
举例:echo ${var##*.}
结果:com
% 和%% 号截取(删右边留左边)
${var%string*}
解释:从右边开始,删除遇到的第一个string以及右边所有的内容。
举例:echo ${var%.*}
结果:http://www.baidu
${var%%string*}
举例:echo ${var%%.*}
结果:http://www
解释:从右边开始,删除遇到的最后(也就是最左边)一个string以及右边所有内容。- 截取指定个数的字符串
${var:n1:n2}
解释:截取n1和n2之间的字符串
例如:
${var:0:5}
表示:从左边第1个字符开始,截取5个字符
${var:7}
表示:从左边第8个字符开始,一直到结束
${var:0-7:5}
表示:从右边第7个字符开始,截取5个字符
${var:0-5}
表示:从右边第5个字符开始,一直到变量结束
7. date用法
参考:https://www.cnblogs.com/alsodzy/p/8403870.html
%% 一个文字的 %
%a 当前locale 的星期名缩写(例如: 日,代表星期日)
%A 当前locale 的星期名全称 (如:星期日)
%b 当前locale 的月名缩写 (如:一,代表一月)
%B 当前locale 的月名全称 (如:一月)
%c 当前locale 的日期和时间 (如:2005年3月3日 星期四 23:05:25)
%C 世纪;比如 %Y,通常为省略当前年份的后两位数字(例如:20)
%d 按月计的日期(例如:01)
%D 按月计的日期;等于%m/%d/%y
%e 按月计的日期,添加空格,等于%_d
%F 完整日期格式,等价于 %Y-%m-%d
%g ISO-8601 格式年份的最后两位 (参见%G)
%G ISO-8601 格式年份 (参见%V),一般只和 %V 结合使用
%h 等于%b
%H 小时(00-23)
%I 小时(00-12)
%j 按年计的日期(001-366)
%k hour, space padded ( 0..23); same as %_H
%l hour, space padded ( 1..12); same as %_I
%m month (01..12)
%M minute (00..59)
%n 换行
%N 纳秒(000000000-999999999)
%p 当前locale 下的"上午"或者"下午",未知时输出为空
%P 与%p 类似,但是输出小写字母
%r 当前locale 下的 12 小时时钟时间 (如:11:11:04 下午)
%R 24 小时时间的时和分,等价于 %H:%M
%s 自UTC 时间 1970-01-01 00:00:00 以来所经过的秒数
%S 秒(00-60)
%t 输出制表符 Tab
%T 时间,等于%H:%M:%S
%u 星期,1 代表星期一
%U 一年中的第几周,以周日为每星期第一天(00-53)
%V ISO-8601 格式规范下的一年中第几周,以周一为每星期第一天(01-53)
%w 一星期中的第几日(0-6),0 代表周一
%W 一年中的第几周,以周一为每星期第一天(00-53)
%x 当前locale 下的日期描述 (如:12/31/99)
%X 当前locale 下的时间描述 (如:23:13:48)
%y 年份最后两位数位 (00-99)
%Y 年份
%z +hhmm 数字时区(例如,-0400)
%:z +hh:mm 数字时区(例如,-04:00)
%::z +hh:mm:ss 数字时区(例如,-04:00:00)
%:::z 数字时区带有必要的精度 (例如,-04,+05:30)
%Z 按字母表排序的时区缩写 (例如,EDT)
注:如果小于 12 小时的话,%k
输出结果数字前面会有空格,如 date -d -1hour +%k
输出结果为 8
。
解决:默认情况下,使用数字 0 来填补数字时间中的空缺。当然也可以指定其他方式:%-
,不填补;%_
,使用空格填补;%0
,使用0;%^
使用大写字母;%#
使用相反的字母。所以上面的问题可以执行这个命令:date -d -1hour +%-k
[heheda@localhost ~]$ date -d 'now' #显示当前时间
Wed Jan 20 03:29:04 UTC 2021
[keysystem@localhost ~]$
[heheda@localhost ~]$ date -d '2 days ago' #显示2天前的时间
Mon Jan 18 03:29:16 UTC 2021
[heheda@localhost ~]$ date -d '3 month 1 day' #显示3月零1天以后的时间
Wed Apr 21 03:29:25 UTC 2021
[heheda@localhost ~]$ date -d '25 Dec' +%j #显示12月25日在当年的哪一天
359
[heheda@localhost ~]$ date -d '30 second ago' #显示30秒前的时间
Wed Jan 20 03:29:15 UTC 2021
[heheda@localhost ~]$ date +%Y-%m-%d #按一定格式显示现在日期
2021-01-20
[heheda@localhost ~]$ date -d "yesterday" +%Y-%m-%d #显示昨天的日期
2021-01-19
[heheda@localhost ~]$ date -d -16hour +%Y-%m-%d #显示从现在往前减16个小时的时间
2021-01-19
在shell脚本中应用:
#!/bin/bash
yesterday=`date -d "yesterday" +%Y-%m-%d`
echo "昨天日期:$yesterday"
7.1 日期函数
来自:shell脚本日期函数
#############################################
# Filename:dateutils.sh
# Revision:1.1
# Date:2018/12/17
# Author: chenchunping
# Description: 日期函数
# Notes:
# 1. get_date 返回当前日期,格式YYYYMMDD
# 2. check_date 检查日期,参数格式YYYYMMDD
# 3. get_before_date 返回昨天时间
# 4. get_next_date 返回明天时间
# 5. get_beforemonth_date 返回N月以前的时间
# 6. get_nextmonth_date 返回N月以后的时间
# 7. get_beforeyear_date 返回N年以前的时间
# 8. get_nextyear_date 返回N年以后的时间
# 9. get_beforeday_date 返回N天以前的时间
# 9. get_nextday_date 返回N天以后的时间
# 10. get_diffdays 返回两个日期的天数
# 11. check_leap 判断是否是闰年
# 12. get_month_begin_date 返回1号日期
# 13. get_month_days 返回月份的天数
# 14. get_month_end_date 返回月末日期
# 15. get_lastmonth_end_date 返回上一个月末日期
#############################################
#获取当前日期,返回格式YYYYMMDD
function get_date(){
currdate=`date "+%Y%m%d"`
echo $currdate
}
#检查日期格式(YYYYMMDD)
function check_date(){
[ $# -ne 1 ] &&echo 1 &&exit 1
lenstr=`expr length "$1"`
[ $lenstr -ne 8 ] &&echo 1 &&exit 1
tmpstr=`echo "$1" | grep "^[^0][0-9]*$"`
year=`expr substr $1 1 4`
month=`expr substr $1 5 2`
day=`expr substr $1 7 2`
[ $month -lt 1 -o $month -gt 12 ] &&echo 1 &&exit 1
days=`get_month_days $1`
[ $day -lt 1 -o $day -gt $days ] &&echo 1 &&exit 1
echo 0
}
#计算指定日期前一天
function get_before_date()
{
if [ $# -eq 1 ];then
sec=`date -d $1 "+%s"`
sec_before_day=$(( sec - 24 * 60 * 60))
days_before=`date -d @$sec_before_day +%Y%m%d`
echo $days_before
else
days_before=`date -d -1days "+%Y%m%d"`
echo $days_before
fi
}
#计算指定日期第二天
function get_next_date()
{
if [ $# -eq 1 ];then
sec=`date -d $1 "+%s"`
sec_next_day=$(( sec + 24 * 60 * 60))
days_next=`date -d @$sec_next_day +%Y%m%d`
echo $days_next
else
days_next=`date -d +1days "+%Y%m%d"`
echo $days_next
fi
}
#参数为2个:计算指定日期n个月以前的日期,参数为1个:当前日期n个月以前的日期
function get_beforemonth_date(){
if [ $# -eq 2 ];then
beforemonth=`date -d "$1 -$2 month" "+%Y%m%d"`
echo $beforemonth
else
beforemonth=`date -d "-$1 month" "+%Y%m%d"`
echo $beforemonth
fi
}
#参数为2个:计算指定日期n个月以后的日期,参数为1个:计算当前日期n个月以后的日期
function get_nextmonth_date(){
if [ $# -eq 2 ];then
nextmonth=`date -d "$1 -$2 month" "+%Y%m%d"`
echo $nextmonth
else
nextmonth=`date -d "+$1 month" "+%Y%m%d"`
echo $nextmonth
fi
}
#参数为2个:计算指定日期n个年以前的日期,参数为1个:计算当前日期n个年以前的日期
function get_beforeyear_date(){
if [ $# -eq 2 ];then
beforemonth=`date -d "$1 -$2 year" "+%Y%m%d"`
echo $beforemonth
else
beforemonth=`date -d "-$1 year" "+%Y%m%d"`
echo $beforemonth
fi
}
#参数为2个:计算指定日期n个年以后的日期,参数为1个:计算当前日期n个年以后的日期
function get_nextyear_date(){
if [ $# -eq 2 ];then
nextmonth=`date -d "$1 -$2 year" "+%Y%m%d"`
echo $nextmonth
else
nextmonth=`date -d "+$1 year" "+%Y%m%d"`
echo $nextmonth
fi
}
#参数为2个:计算指定日期n天以前的日期,参数为1个:计算当前日期n天以前的日期
function get_beforeday_date()
{
if [ $# -eq 2 ];then
days_before=`date -d "$1 -$2 day" "+%Y%m%d"`
echo $days_before
else
days_before=`date -d "-$1 day" "+%Y%m%d"`
echo $days_before
fi
}
#参数为2个:计算指定日期n天以后的日期,参数为1个:计算当前日期n天以后的日期
function get_nextday_date()
{
if [ $# -eq 2 ];then
days_next=`date -d "$1 +$2 day" "+%Y%m%d"`
echo $days_next
else
days_next=`date -d "+$1 day" "+%Y%m%d"`
echo $days_next
fi
}
#计算两个日期的间隔天数
function get_diffdays()
{
startdate_sec=`date -d $1 "+%s"`
enddate_sec=`date -d $2 "+%s"`
diff_sec=$((enddate_sec - startdate_sec))
diff_days=$((diff_sec / 86400))
echo $diff_days
}
#判断是否闰年(时间格式YYYYMMDD)
function check_leap(){
year=`expr substr $1 1 4`
r1=$(( year % 4 ))
r2=$(( year % 100 ))
r3=$(( year % 400 ))
if [ $r1 -eq 0 -a $r2 -ne 0 -a $r3 -eq 0 ];then
fren="true"
else
fren="false"
fi
echo $fren
}
#获取指定日期的当月1号
function get_month_begin_date(){
begin_date=`date -d "$1" "+%Y%m01"`
echo $begin_date
}
#获取指定日期当月的天数
function get_month_days(){
currdate=`date -d "$1" "+%Y%m%d"`
year=`expr substr $currdate 1 4`
month=`expr substr $currdate 5 2`
case $month in
01|03|05|07|08|10|12) days=31;;
04|06|09|11) days=30;;
02)
leap_year=`check_leap $currdate`
if [ "$leap_year" = "true" ];then
days=29
else
days=28
fi
;;
*)
days=0
;;
esac
echo $days
}
#指定日期所在月份最后日期
function get_month_end_date(){
date=`date -d "$1" "+%Y%m%d"`
year=`expr substr $date 1 4`
month=`expr substr $date 5 2`
days=`get_month_days $1`
end_date=$(( $(( $(( year * 10000 )) + $(( month * 100 )))) + days ))
echo $end_date
}
#指定日期的上一个月最后日期
function get_lastmonth_end_date(){
begin_date=`date -d "$1" "+%Y%m01"`
lastmonth_end_date=`date -d "$begin_date -1 day" "+%Y%m%d"`
echo $lastmonth_end_date
}
8. jar包的启动停止
#!/bin/bash
COMMAND="$1"
if [[ "$COMMAND" != "start" ]] && [[ "$COMMAND" != "stop" ]] && [[ "$COMMAND" != "restart" ]]; then
echo "Usage: $0 start | stop | restart"
exit 0
fi
APP_BASE_PATH=$(cd `dirname $0`; pwd)
function start()
{
nohup java -Xms128m -Xmx512m -jar ${JAVA_OPTS} dwarehouse-service-1.0.0-SNAPSHOT.jar >> output.log 2>&1 &
echo "--------项目启动成功--------"
}
function stop()
{
P_ID=`ps -ef | grep -w dwarehouse-service-1.0.0-SNAPSHOT.jar | grep -v "grep" | awk '{print $2}'`
kill $P_ID
echo "项目已关闭"
}
function restart()
{
P_ID=`ps -ef | grep -w dwarehouse-service-1.0.0-SNAPSHOT.jar | grep -v "grep" | awk '{print $2}'`
kill -9 $P_ID
sleep 25
start
echo "项目重启成功"
}
if [[ "$COMMAND" == "start" ]]; then
start
elif [[ "$COMMAND" == "stop" ]]; then
stop
else
restart
fi
执行该脚本命令(重启项目):bash dwarehouse.sh restart
、bash dwarehouse.sh stop && bash dwarehouse.sh start
9. 分割字符串循环遍历
#!/bin/bash
sleeptime="3"
test="aa,bb,cc"
arr=$(echo $test|tr "," "\n")
for x in $arr
do
if [ $x == "bb" ]
then
echo $x
fi
sleep $sleeptime
done
9.1 数字遍历
如果你需要在 Shell 脚本中遍历一系列数字,你可以使用 for 循环结合 seq 命令或者使用 bash 的原生计算特性。以下是两种常见的方法:
(1)使用 seq 生成一系列数字:
for i in $(seq 1 10); do
echo "Number is $i"
done
(2)使用 bash 的原生计算特性进行遍历:
for ((i=1; i<=10; i++)); do
echo "Number is $i"
done
两种方法都会输出从1到10的数字。第二种方法不需要调用外部命令,因此可能在某些情况下更快。
10. 遍历目录下的文件
一个 for 循环实现一个目录下的文件和目录遍历,很实用
[root@localhost shell_order]# cat test27.sh
#!/bin/bash
#print the directory and file
for file in /home/hustyangju/*
do
if [ -d "$file" ]
then
echo "$file is directory"
elif [ -f "$file" ]
then
echo "$file is file"
fi
done
[root@localhost shell_order]# ./test27.sh
/home/hustyangju/array is directory
/home/hustyangju/menuwindow-7.12 is directory
/home/hustyangju/menuwindow-build-desktop is directory
/home/hustyangju/shell_order is directory
[root@localhost shell_order]#
递归遍历:
#!/bin/bash
function getdir(){
for element in `ls $fd` # 注意此处这是两个反引号,表示运行系统命令
do
dir_or_file=$fd"/"$element
if [ -d $dir_or_file ] # 注意此处之间一定要加上空格,否则会报错
then
getdir $dir_or_file
else
echo $dir_or_file # 在此处处理文件即可
fi
done
}
root_dir="/opt/datas"
getdir $root_dir
参数:
- -e 判断对象是否存在
- -d 判断对象是否存在,并且为目录
- -f 判断对象是否存在,并且为常规文件
- -L 判断对象是否存在,并且为符号链接
- -h 判断对象是否存在,并且为软链接
- -s 判断对象是否存在,并且长度不为0
- -r 判断对象是否存在,并且可读
- -w 判断对象是否存在,并且可写
- -x 判断对象是否存在,并且可执行
- -O 判断对象是否存在,并且属于当前用户
- -G 判断对象是否存在,并且属于当前用户组
- -nt 判断file1是否比file2新 [ “/data/file1” -nt “/data/file2” ]
- -ot 判断file1是否比file2旧 [ “/data/file1” -ot “/data/file2” ]
10.1 获取文件大小
# 使用stat命令
filesize=$(stat -c %s filename)
# 使用du命令
filesize=$(du -h filename | cut -f 1)
11. 每隔几秒钟往 Kafka 发送消息的测试脚本
vim test.sh
#!/bin/bash
test="2023-12-05,2023-12-06,2023-12-07"
arr=$(echo $test|tr "," "\n")
for ((i=1; i<=3000; i++)); do
for x in $arr
do
sleep 5s
kafka-console-producer --broker-list 110.110.110.110:9092 --topic xiaoqiang_test <<EOF
{"studentName":"zhangsan","studentNum":"1","enrolDate":"$x"}
EOF
currdate=`date +%Y%m%d-%H:%M:%S`
echo $currdate" 成功发送:{"studentName":"zhangsan","studentNum":"1","enrolDate":"$x"}"
done
done
sh test.sh >> test.log 2>&1 &
12. sleep
在 Linux 系统中,shell 命令 sleep 的时间单位默认是秒。
此外,sleep 命令还支持其他单位,如分钟、小时和天。具体来说,常见的时间单位包括:
- 秒(s)。例如,
sleep 5s
表示暂停5秒。 - 分钟(m)。例如,
sleep 1m
表示暂停1分钟。 - 小时(h)。例如,
sleep 1h
表示暂停1小时。 - 天(d)。例如,
sleep 1d
表示暂停1天。
这些单位可以使我们在编写 shell 脚本时更加灵活地控制程序的执行流程,例如添加延时操作或等待特定的时间间隔。需要注意的是,在使用 sleep 命令时,必须指定一个非负数,否则命令将执行失败。
13. 附
-
赋值的时候不要有空格。
错误写法:var = "heheda"
正确写法:var="heheda"
-
[
要有空格。
错误写法:if [${i} == "2"]
正确写法:if [ ${i} == "2" ]