Shell module

概述

标准化模板规范:

#!/usr/bin/env bash
######################################################
## Program Name:
## Description:
## Author:
## Creation Date:
######################################################
# Modification History
######################################################
# Date        Modified        Task        Description
# ====================================================
# 20231107    someone         1            module
echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] check the variable is ready or not"
var1=$1
var2=$2
var3=$3
if [ $# -ne 3 ];then
    echo "`date '+%Y-%m-%d %H:%M:%S'`:[ERROR] check the variable is not ready"
    echo "var1=$1 var2=$2 var3= $3"
    exit 1
else
    echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] check the variable is ready"
fi


echoVar(){
    echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] exec the function echoVar"
    echo $var1
    echo $var2
    echo $var3
    echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] function echoVar finished"
}

echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] output default ENV"
WORKSPACE=`pwd`
echo "WORKSPACE = $WORKSPACE"

echo "count.txt = `ls -l $WORKSPACE | grep 'count.txt'`"

echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] read line"
if [[ ! -e $WORKSPACE/count.txt && ! -s $WORKSPACE/count.txt ]];then
    echo "`date '+%Y-%m-%d %H:%M:%S'`:[ERROR] count.txt is not ready"
    exit 1
else
    echo "`date '+%Y-%m-%d %H:%M:%S'`:[INFO] count.txt is ready, output the line"
    while read line
    do
        echo $line
    done < count.txt
fi

echoVar

Shell module_第1张图片

案例

#!/usr/bin/env bash
######################################################
## Program Name:
## Description:
## Author:
## Creation Date:
######################################################
# Modification History
######################################################
# Date        Modified        Task        Description
# ====================================================
# 20231107    someone         1            module

案例1概述

#!/bin/bash
if [ -z "${NEXUS_ID}" ] || [ -z "${NEXUS_VERSION}" ]; then
    echo "the length of NEXUS_ID or NEXUS_VERSION is zero"
    
    echo "NEXUS_ID: ${NEXUS_ID}"
    echo "NEXUS_VERSION: ${NEXUS_VERSION}"
    exit 3
fi

if [ -z "${NEXUS_USERNAME}" ] || [ -z "${NEXUS_PASSWORD}" ]; then
    echo "the length of NEXUS_USERNAME or NEXUS_PASSWORD is zero"
    
    echo "NEXUS_USERNAME: ${NEXUS_USERNAME}"
    echo "NEXUS_PASSWORD: ${NEXUS_PASSWORD}"
    exit 3
fi

NEXUS_URL=${NEXUS_URL:="https://nexus.com:8080"}

function GET_RELEASE_VERSION() {

    NEXUS_RELEASE_URL=$1
    set +x
    wget --user=${NEXUS_USERNAME} --password=${NEXUS_PASSWORD} ${NEXUS_RELEASE_URL}
    set -x
}

function main() {
    GET_RELEASE_VERSION 
}

main

字符串运算符

Shell 基本运算符 | 菜鸟教程 (runoob.com)

假定变量 a 为 "abc",变量 b 为 "efg":

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ] 返回 true。
$ 检测字符串是否不为空,不为空返回 true。 [ $a ] 返回 true。

Shell module_第2张图片

逻辑运算符

假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

布尔运算符

假定变量 a 为 10,变量 b 为 20

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

if 函数

Shell 流程控制 | 菜鸟教程 (runoob.com)

格式一:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

格式二:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

 if 用来筛选文件夹

for file in `ls -a`
do
    if [[ $file != '.' && $file != '..' ]]
    then
        echo $file
    else
        echo "special ========= $file"
    fi
done

Shell module_第3张图片

:= 功能: 设置默认值

属于shell 变量操作:根据状态为变量赋值

shell变量操作${}详细用法 - 云翼1213 - 博客园 (cnblogs.com)

Shell module_第4张图片

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
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt

Shell module_第5张图片

:- 功能: 设置默认值

属于shell 变量操作:根据状态为变量赋值

Shell module_第6张图片

shell 的 function

Shell 函数 | 菜鸟教程 (runoob.com)

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"


funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

Shell module_第7张图片

案例2概述

#!/bin/bash
Dir=$1
backup="${Dir}/backup"
echo "backup: $backup"

[ ! -d ${bakup_dir} ] && mkdir -p ${backup}/${month}

echo "$backup/$month"
rm -rf ${backup}/${month}

shell的传参方式

Shell 传递参数 | 菜鸟教程 (runoob.com)

参数处理 说明
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

案例3概述

#!/bin/bash
server_address=$1
server_name=$2
output_path=$3
user=$4

# ossutil installed or not? not ==> installed
which ossutil

if [ $? -ne 0 ];then
    echo "ossutil install"
    mkdir -p /home/$user/.local/bin
    cp -rf ./ossutil /home/$user/.local/bin
    chmod 0755 /home/$user/.local/bin/ossutil
fi

# create output folder
timeout 30s ssh ${server_name}@${server_address} "if [ ! -d ${output_path} ];then mkdir -p ${output_path}; fi"

# echo success

chmod

Linux chmod 命令 | 菜鸟教程 (runoob.com)

Shell module_第8张图片

关系运算符

假定变量 a 为 10,变量 b 为 20

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

Shell module_第9张图片

ssh 远程服务器执行命令

# ssh 用户@IP地址 "执行的命令"
ssh ${server_name}@${server_address} "if [ ! -d ${output_path} ];then mkdir -p ${output_path}; fi"

cp

参数

  • -r 或 --recursive:用于复制目录及其所有的子目录和文件,如果要复制目录,需要使用该选项。
  • -i 或 --interactive:在复制前提示确认,如果目标文件已存在,则会询问是否覆盖,回答 y 时目标文件将被覆盖。。
  • -u 或 --update:仅复制源文件中更新时间较新的文件。
  • -v 或 --verbose:显示详细的复制过程。
  • -p 或 --preserve:保留源文件的权限、所有者和时间戳信息。
  • -f 或 --force:强制复制,即使目标文件已存在也会覆盖,而且不给出提示。
  • -l:不复制文件,只是生成链接文件。

案例4概述

#!/bin/bash
set -x
echo `date "+%Y-%m-%d %H:%M:%S"`

for num in {1..10};
do
    echo "number: ${num}"
done

echo `date -d "30 minute age" + %s`

while read line + done < test.txt

while read line
do
    echo $line
done < count.txt

Shell module_第10张图片

date

date '+%Y-%m-%d %H:%M:%s'

date +%Y%m

date +%Y%m%d

bath_date=${4:-$(date +%Y%m%d)}

echo "`date '+%Y-%m-%d %H:%M:%s'`:[INFO] SOMETHING INFOS"

Shell module_第11张图片

date -d "2 year ago" +"%Y%m%d%H%M%S"

 

export

用于设置或显示环境变量。

在 shell 中执行程序时,shell 会提供一组环境变量。export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。

Linux export命令 | 菜鸟教程 (runoob.com)

awk -F

 -F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:

Linux awk 命令 | 菜鸟教程 (runoob.com)

grep -c

  • -c:只打印匹配的行数。
  • -i:忽略大小写进行匹配。
  • -v:反向查找,只打印不匹配的行。
  • -n:显示匹配行的行号。
  • -r:递归查找子目录中的文件。
  • -l:只打印匹配的文件名。

Shell module_第12张图片

Linux grep 命令 | 菜鸟教程

sed + p

Linux sed 命令 | 菜鸟教程 (runoob.com)

Shell module_第13张图片

set +x

  • -a  标示已修改的变量,以供输出至环境变量。
  • -b  使被中止的后台程序立刻回报执行状态。
  • -C  转向所产生的文件无法覆盖已存在的文件。
  • -d  Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
  • -e  若指令传回值不等于0,则立即退出shell。
  • -f   取消使用通配符。
  • -h  自动记录函数的所在位置。
  • -H Shell  可利用"!"加<指令编号>的方式来执行history中记录的指令。
  • -k  指令所给的参数都会被视为此指令的环境变量。
  • -l  记录for循环的变量名称。
  • -m  使用监视模式。
  • -n  只读取指令,而不实际执行。
  • -p  启动优先顺序模式。
  • -P  启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
  • -t  执行完随后的指令,即退出shell。
  • -u  当执行时使用到未定义过的变量,则显示错误信息。
  • -v  显示shell所读取的输入值。
  • -x  执行指令后,会先显示该指令及所下的参数。
  • +<参数>  取消某个set曾启动的参数。

Linux set命令 | 菜鸟教程 (runoob.com)

for 循环逐行读取文件

for line in `cat count.txt`; do echo $line; done

Shell module_第14张图片

重定向

2>&1

Shell 重定向 2>&1 含义说明

你可能感兴趣的:(Linux,+,Shell,开发语言)