Makefile shell subst $(1)

MAKE_3_80_realpath    = $(shell $(top_srcdir)/scripts/realpath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

以上Makefile思考好几天不得要领:

今天想通了,是为记。

 

include $(top_srcdir)/include/mk/functions.mk

functions.mk的内容如下:

SQUOTE            := '

# ' # to keep colorized editors from going nuts

MAKE_3_80_realpath    = $(shell $(top_srcdir)/scripts/realpath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

MAKE_3_80_abspath    = $(shell $(top_srcdir)/scripts/abspath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

几个要点:

1.'不能单独出现,所以巧妙匹配# '

2.$(1)百思不得其解,后来在source insight中搜索对MAKE_3_80_realpath 的引用 发现:

abs_top_builddir        := $(call MAKE_3_80_abspath,$(top_builddir))

$(1)是call函数中的参数

'$(subst $(SQUOTE),\\$(SQUOTE),$(1))'先对参数进行字符替换,里面有个小trick,‘替换为\'

\\第一个为转义字符

 

$(top_srcdir)/scripts/realpath.sh
############## realpath.sh ############
. "${0%/*}/lib/file_functions.sh"

######### file_functions.sh ###########
_abspath() {
    echo "$@" | awk -v PWD=$(pwd) '{
    sub(/^[[:space:]]+/, ""); sub(/[[:space:]]+$/, ""); # 1.
    if ($0 == "") {
        print PWD
    } else {
        if (!($0 ~ /^\//)) { # i.
            $0 = PWD "/" $0
        }
        while (gsub(/\/\//, "/")) { }; # ii.
        while (sub(/\/[^\/]+\/\.\.\/?/, "/")) { }; # iii.
        while (sub(/\/\.\//, "/")) { }; # iv.
        sub(/(\/\.)?\/$/, "");
        sub(/^\.\//, "/");
        sub(/\/\.$/, "");
        if ($0 == "") {
            print "/"
        } else {
            if ($0 == ".") {
                print PWD
            } else {
                print
            }
        }
    }
}'
}

_realpath() {
    readlink -f "$@"
}
######### end of file_functions.sh ####
while [ $# -gt 0 ] ; do
    echo -n $(_realpath "$1")
    [ $# -gt 1 ] && echo -n " "
    shift
done
######### end of realpath.sh ##########

 

. "${0%/*}/lib/file_functions.sh"   ${0%/*}见下面解释,%/* 表示从右边开始,删除第一个 / 号及右边的字符 第一个.号表示source 导入的意思。

MAKE_3_80_realpath    = $(shell $(top_srcdir)/scripts/realpath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

MAKE_3_80_abspath    = $(shell $(top_srcdir)/scripts/abspath.sh '$(subst $(SQUOTE),\\$(SQUOTE),$(1))')

_abspath 不想去细究了,直接试一下

 ttt -> safe_rm.sh

./abspath.sh ttt

/home/zhangyi/work/ltp-ddt-fmsh-psoc-test/scripts/ttt

./realpath.sh ttt
/home/zhangyi/work/ltp-ddt-fmsh-psoc-test/scripts/safe_rm.sh

 

 

 

${0##*/} ${0#*/} ${0%/*} ${0%%/*}

 

 

Linux 的字符串截取很有用。有八种方法。

假设有变量 var=http://www.aaa.com/123.htm.

1 . # 号截取,删除左边字符,保留右边字符。

复制代码 代码如下:

echo ${var#*//}
  • 1

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符,即删除 http://
结果是 :www.aaa.com/123.htm

2 . ## 号截取

复制代码 代码如下:

echo ${var##*/}
  • 1

##*/ 表示从右边开始删除第一个 / 号及左边的所有字符,即删除 http://www.aaa.com/
结果是 123.htm

3 . %号截取,删除右边字符,保留左边字符

复制代码 代码如下:

echo ${var%/*}
  • 1

%/* 表示从右边开始,删除第一个 / 号及右边的字符

结果是:http://www.aaa.com

4 . %% 号截取,删除右边字符,保留左边字符

复制代码 代码如下:

echo ${var%%/*}
  • 1

%%/* 表示左边开始,删除第一个 / 号及右边的字符
结果是:http:

5 . 从左边第几个字符开始,及字符的个数

复制代码 代码如下:

echo ${var:0:5}
  • 1

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

6 . 从左边第几个字符开始,一直到结束。

复制代码 代码如下:

echo ${var:7}
  • 1

其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm

7 . 从右边第几个字符开始,及字符的个数
复制代码 代码如下:

echo ${var:0-7:3}
  • 1

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123

8 . 从右边第几个字符开始,一直到结束。

复制代码 代码如下:

echo ${var:0-7}
  • 1

表示从右边第七个字符开始,一直到结束。
结果是:123.htm

注:左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示

转载于:https://www.cnblogs.com/idyllcheung/p/10419010.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值