Shell脚本知识技巧总结

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 restartbash 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" ]

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小强签名设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值