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-fmxx-psoc-test/scripts/ttt

./realpath.sh ttt
/home/zhangyi/work/ltp-ddt-fmxx-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 表示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM