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
%/* 表示從右邊開始,刪除第一個 / 號及右邊的字符
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 表示
