sh脚本学习

$

变量替换

引用变量/获取变量的值

xml = foo
echo $xml

命令替换

执行括号内的命令将输出赋给变量

dd = $(data) # 执行data,并将输出赋值给dd

$0

表示最近执行的命令或脚本的退出码状态。

 repo init -m ${xml} && repo sync -j20 --force-sync

    if [ "$?" != "0" ];then

        echo "repo sync error"

        exit -1

    fi

repo init -m ${xml} && repo sync -j20 --force-sync

  • 返回0:表示初始化成功,清单有效
  • 返回1:同步失败

${FUNCNAME[1]}

echo ">>>>>> Function(): ${FUNCNAME[1]} $dd"

获取调用栈中上层函数的名称。

eg

查找lock文件

allLock=$(repo forall -p -j30 -v -c 'ls .git/* | grep "\.lock" | grep -v "gc.log"')
# ls .git/* 列出.git目录下的所有文件和子目录
# grep "\.lock" 从ls .git/*的输出中找到包含.lock的文件
# grep -v "gc.log" 排除包含gc.log的文件
  • 检查所有 Git 仓库是否存在锁文件(.lock),表示是否有未完成或中断的 Git 操作。
  • 锁文件存在可能表明 Git 操作被中断

检查变基状态

allRebase=$(repo forall -p -j30 -v -c 'ls .git/* | grep "rebase-"')

data

dd = $(data)
  • 获取当前系统的日志和时间。
  • 提供时间戳,跟踪脚本执行时间

测试操作符

-z 检查字符串是否为空

if [ ! -z "${allLock}" ] || [ ! -z "${allRebase}" ];then
  • 测试符,检查字符串是否为空。
  • 字符串为空,返回true,否则返回false

-d 检查目录是否存在

if [ ! -d "${cogitDir}/$1" ];
  • 存在且为目录,返回true,否则返回false

-f 测试文件是否存在且是普通文件

if [ ! -f "${pidOutDir}/pid.cfg" ];then
  • 存在且是普通文件,返回true,否则返回false

匹配操作符

=~

if [[ ${PID} =~ "950" ]]; then # PID是否包含950

cd -

cd - # 切换到上一个目录

awk

awk -F '_' '{print $3}' # 解析输入字符串并提取第三个字段
# -F 设置字符串分隔符
# print $3 选择第三个字段,$0选择整行

函数声明

不需要在声明时指定参数个数,调用时传入即可

myFunc arg1 arg2

function myFunc()
{
	echo $1 # $1表示第一个参数arg1
}

bash

  • 脚本的第一行,指定脚本由bin/bash解释运行
    #!bin/bash
    
  • 调用另一个bash脚本或子shell执行命令
  • 执行字符串命令
    bash -c "echo $PATH"
    
    bash -c "cd ${cogitDir}/$1 && git checkout $2"
    
    -cBash 直接执行字符串中的命令,而不是运行脚本文件或进入交互式 shell

\(``\)

\(``\)反引号的目的是运行命令并获取其输出,而不是直接输出字符串。

echo `pwd`

sed

stream editor流编辑器,处理文本。

sed -i "/WhaleCast/d" ${repoDir}/device/amlogic/common/core_amlogic.mk
# -i 表示原地编辑,直接修改原文件,而不是输出到终端
# "/WhaleCast/d" 匹配包含WhaleCast的行并delete
posted @ 2025-07-23 10:47  伍壹丷  阅读(20)  评论(0)    收藏  举报