Linux Shell常用小功能汇总实现

具体实现样例

Shell实现while循环

while 循环体
do
循环体
done

  • 非死循环实现
    注意:while循环条件中括号与内部内容之间留有空格
    1
    2
    3
    4
    5
    6
    7
    # 循环输出0-10
    i=0
    while [ $i -le 10 ]
    do
    echo $i
    i=$[$i+1]
    done
  • 死循环实现
    死循环while条件可直接用“:”,注意“:”两边有空格
    当然也可以直接将循环条件变成恒为True的情况,比如下面两种
    while [ "1" = "1" ]
    while test "1" = "1"
    1
    2
    3
    4
    5
    6
    7
    i=0
    while :
    do
    echo $i
    i=$[$i+1]
    sleep 2s
    done

Shell判断文件或文件夹是否存在

更多判断条件见Shell脚本中和文件相关的判断符

  • 文件是否存在判断
    注意:if条件中括号与内部内容之间留有空格
    1
    2
    3
    4
    5
    if [ -f "/home/filename" ];then
    echo "文件已存在"
    else
    echo "文件不存在"
    fi
  • 文件夹是否存在判断
    注意:if条件中括号与内部内容之间留有空格
    1
    2
    3
    4
    5
    if [ -d "/home/" ];then
    echo "文件夹存在"
    else
    echo "文件夹不存在"
    fi

Shell判断一个变量或输入参数是否为空

  • 判断变量是否为空
    变量从终端获取
    1
    2
    3
    4
    5
    6
    read -p "请输入:" varvalue
    if [ ! -n "$varvalue" ] ;then
    echo "未输入,变量为空"
    else
    echo "已输入,变量非空:$varvalue"
    fi
    变量直接赋空
    1
    2
    3
    4
    5
    6
    varvalue=
    if [ ! $varvalue ]; then
    echo "变量为空"
    else
    echo "变量非空"
    fi
  • 判断输入参数是否为空
    1
    2
    3
    4
    5
    if [ ! -n "$1" ] ;then
    echo "参数为空"
    else
    echo "参数非空:$1"
    fi
    除以上方法外,还可以用如下判断条件判断
    if test -z "$varvalue"
    if [ "$varvalue" = "" ]

Shell中等待一定时间或等待进程结束实现

  • 等待一定时间
    sleep支持的时间单位为 h(时),m(分),s(秒)

    1
    2
    3
    4
    sleep 3  # 不加单位默认是秒,等待3秒
    sleep 1s # 等待1秒
    sleep 1m # 等待1分
    sleep 1h # 等待1小时
  • 等待进程或作业执行完毕
    wait支持等待进程或作业执行完毕。
    可通过jobs命令查看后台进行中的作业

    1
    2
    3
    wait  # 等待当前进程结束后执行
    wait 1234 # 等待进程号为1234进程结束后执行
    wait %1 # 等待作业标识号为1的作业结束后执行(作业标识号前必须添加备份号"%")

Shell脚本实现并行处理数据

  • 并行实现思路之一
    可通过后台运行符&和进程等待wait组合实现
    1
    2
    3
    4
    # 假设已经实现好了两个任务脚本1.sh和2.sh让这两个脚本并行执行。  
    ./1.sh & # 执行任务1,不阻塞等待
    ./2.sh & # 执行任务2,不阻塞等待
    wait # 等待子进程任务1,2执行结束(确保任务都执行完毕)

Shell脚本获取某个目录下(除去指定文件)的所有文件

  • 获取某个目录下所有文件
    方式一,使用通配符*
    1
    2
    3
    4
    for name in /etc/*
    do
    echo $name
    done
    方式二,使用ls命令
    1
    2
    3
    4
    for name in `ls /etc/`
    do
    echo $name
    done
  • 获取某个目录下扩展名固定的所有文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for name in /etc/*.conf  # 获取etc目录下所有扩展名为.conf的文件
    do
    echo $name
    done
    ```
    - 获取某个目录下除去某些指定文件的所有文件
    `利用ls或ls -a与grep -v命令组合`
    `以下样例代码获取/etc/目录下的除去yum、yum.conf、c.txt三个文件的其余文件`
    ```bash
    for name in `ls /etc/ | grep -v 'yum\|yum.conf\|c.txt'` # 注意字符串中的管道符|需要用反斜线进行转义\|
    do
    echo $name
    done

Shell脚本连接(拼接/合并)字符串

  • Shell脚本连接字符串
    Shell字符串拼接不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    string1="hello"
    string2="word"
    #===========#
    str1=$string1$string2 #中间不能有空格,没有引号空格会被识别成终止符
    str2="$string1 $string2" #被引号包围,中间可以有空格
    str3=$string1": "$string2 #夹带其他字符串连接
    str4="$string1: $string2" #同str3
    str5="${string1}111: ${string2}222" #这种情况需要给变量名加上大括号
    #===========#
    echo $str1
    echo $str2
    echo $str3
    echo $str4
    echo $str5

Shell获取时间戳

  • date更多用法见Linux系统date命令用法小记
    1
    2
    3
    4
    date +%s  # 获取秒级时间戳
    date +%s%3N # 获取毫秒级时间戳
    date +%s%6N # 获取微秒级时间戳
    date +%s%N # 获取纳秒级时间戳