first version.
[build-srcpkg.git] / bin / stdcode.md
blobaa594e795eb144f9045c1477eea74c4f466e8744
2 @ online shell program check
3 https://www.shellcheck.net/#
4 # or use compile check in shell programmar.
8 @ NOTE
9 # use "" around $envar, if there is ' ' in envar or not
10 # use ${envar} instead of $envar, when ${envar}_xxx.
14 ======================================================================
16 @ works in std-sh
17 echo ${#aaa} ${aaa+123} $((1+2)) # it's in normal.
18 # test 1 && test 1
19 # test 1 || test 1
21 @ param "$@"
22 $ foo () {
23 > echo "$@"  
24 > }
25 $ foo 1 2 "3 4 5" 6 7    
26 1 2 3 4 5 6 7
27 $ foo 1  2  "3  4  5"  6  7
28 1 2 3  4  5 6 7
31 @ { } codeblock does not launch as a sub-proc
32 $ unset abc
33 $ echo abc=$abc
34 abc=
35 $ { echo abc=$abc
36 > abc=111
37 > echo abc=$abc
38 > } << EOF
39 > aaa
40 > EOF
41 abc=
42 abc=111
43 $ echo abc=$abc
44 abc=111
48 ======================================================================
50 @ [[ ]] ==> test
51 @ =~
52 @ envar
53 @ redirect
54 @ pipe
58 ======================================================================
60 @ [[ ]] ==> test
61 # normal
62 # -v
64 @ =~
65 # strstr(), regexstr(), pfx of p/n.
67 @ envar
68 # inner cmd of declare, implmented by eval in func.
69 # ${XXX} oprs. 
70 + '#', '##', '%', '%%', '//', '//', '^', '^^', ',', ',,', 
71 + slice
72 + array cnt, array content, 
73 + ref
74 # array
75 + defination(decl)/unset/access(@)
76 + array value init
78 @ redirect
79 # subscript in/out re-dir
80 # <<<
84 ======================================================================
86
87 # [[ ==> test
88 # test $abc = 111 ==> test "$abc" = 111
91 @ [[ ]] ==> test
92 # [[ $STR1" == "$STR2" ]]
93 test "$STR1" = "$STR2"
94 # [[ "$STR1" == "$STR2" || [[ "$STR1 == "$STR3" ]]
95 test "$STR1" = "$STR2" -o "$STR1" = "$STR3"
96 # [[ "$STR1" == "$STR2" && [[ "$STR1" == "$STR3" ]]
97 test "$STR1" = "$STR2" -a "$STR1" = "$STR3"
98 # [[ -z "$STR1" ]]
99 test "x$STR1" = x
100 test -z "$STR1"
101 # [[ -n "$STR1" ]]
102 # [[ -e "$file" ]]
103 # [[ "$file1" -ot "$file2" ]]
106 @ =~
107 # [[ ${ENVAR} =~ xxx ]]
108 IFS=$'\n' BASH_REMATCH=( `cat "${ENVAR}" | grep -E "([[:alnum:]]_)*_test\.c"` )
109 expr "${ENVAR}" : "([[:alnum:]]_)*_test\.c"
110 echo "$ENVAR  " | grep -o -P "xxx" >/dev/null 2>&1
111 # [[ "$CONTENT" =~ $FMT ]]
112 FMT="[([[:alnum:]_]*)]"
113 OUTFMT="'(\1)'"
114 cat $CONTENT | grep -E $FMT
115 cat $CONTENT | sed -E "s/$FMT/$OUTFMT/p"
116 eg: code in args.shlib==>str_dispatch()
119 @ envar
120 # echo ${#aaa} (valid)
121 expr length "${aaa}"
122 # echo ${aaa:1:2} 
123 expr substr "${aaa}" 1 2
124 # echo ${aaa//a/b} 
125 echo "${aaa}" | sed -E "s/a/b/g"
126 # echo ${aaa#*a} (valid)
127 echo "${aaa}" | sed -E "s/^.*a//g"
128 # echo ${aaa##*a} (valid)
129 echo "${aaa}" | sed -E "s/^(.*a)+//g"
130 # echo ${aaa,,} 
131 echo "${aaa}" | tr [[:upper:]] [[:lower:]]
132 # echo ${aaa^^} 
133 echo "${aaa}" | tr [[:lower:]] [[:upper:]]
134 # echo ${!abc}
135 eval echo \${$abc}
138 @ redirect
139 # echo abc > file1.txt
140 # echo abc >> file1.txt
141 # cat - < echo abc
142 # cat - << EOF
145 # cat - <<< "string"
146 echo "string" | cat -
147 # echo abc >&2
148 # echo abc >&/tmp/file.tmp
149 # eval exec $fd<>$file
150 # exec $fd>&-
152 @ pipe
153 # echo abc | cat -
154 # echo abc 
155 # diff <(echo abc) <(echo abcd)
156 foo1() { echo abc }
157 foo2() { echo abcd }
158 redir_out()
160         local i
161         
162         i=$(ulimit -n)
163         for (( i=$((i-1)); i>0; i-- )); do
164                 [[ ! -e /proc/self/fd/$i ]] && break
165         done
167         mkfifo /dev/fd${i}
168         $1 >/dev/fd${i}
169         echo "/dev/fd${i}"
171 diff $(redir_out foo1) $(redir_out foo2)
173 @ declare implmented by eval in func.
175 @ ${XXX} '#', '##', '%', '%%'
176 # ${abc%%xxx*} ==> echo "${abc}" | sed -E "s/xxx.*$//g"
177 # ${abc%xxx*} ==> echo "${abc}" | sed -E "s/(.*)xxx.*$/\1/g"
178 # ${abc##*xxx} ==> echo "${abc}" | sed -E "s/.*xxx(.*)$/\1/g"
179 # ${abc#*xxx} ==> echo "${abc}" | sed -E "s/.*xxx(.*)$/\1/g"
180 # ${!abc} ==> eval echo "${abc}"
182 @ array in defination
183 # use grep to get defination string
185 # ()
186 : [=][(](.*(['][^']['])*|(["][^"]["])*|([`][^'][`])*.*)*[)]
187 [=][(]
190 (['][^']['])*
191 |(["][^"]["])*
192 |([`][^'][`])*
198 # ""
199 [\"]
202 (['][^']['])*
203 |(["][^"]["])*
204 |([`][^`][`])*
205 |\$([\(][^\(][\)])*
208 [\"][[:blank:]]$
210 # eg:
211 [=][(](.*(['][^']['])*|(['][^']['])*.*)[)]
213 str="SRCPKG_LICENSE=( AAA
214 'MIT'
215 'MIT' 'Apache-2.0' 'BSD-3-Clause'
216 'GPL-3.0' 'LGPL-3.0' 'MPL-2.0'
217 'GPL' 'GPL-2.0' 'ISC' 'PMIT')abc"
218 devenkong@ubuntu:~$ echo "$str" | grep -zoE "[\=][\(]([^']*['][^']*['])*\)"
219 SRCPKG_LICENSE=( AAA
220 'MIT'
221 'MIT' 'Apache-2.0' 'BSD-3-Clause'
222 'GPL-3.0' 'LGPL-3.0' 'MPL-2.0'
223 'GPL' 'GPL-2.0' 'ISC' 'PMIT')abc
227 @ array envar
228 # an easier and limited way to use array
229 https://www.baeldung.com/linux/posix-shell-array
230 $ set -- 1 2 3
231 $ echo $@
232 1 2 3
233 $ set -- "$@" a   # add item
234 $ shift # Remove item
235 # AAA=(1 2 3)
236 abc[1]=string # report error
237 set abc[1]=string # it's ok
238 set abc[1]=string # it's ok
239 add func array()
240 array ()
242         local i
243         local cnt=$(($#-2))
245         [[ -z "$1" ]] && return
247         for ((i=2; i<$cnt; i++)); do
248                 eval set ${1}_${i}="\$$i"
249         done
251 arrayr ()
253         [[ $2 != '@' ]] && eval echo -ne \"\${${1}_${2}}\" && return
255         local i
256         local cnt=$(($#-2))
257         local tmp
259         [[ -z "$1" ]] && return
261         for ((i=2; i<$cnt; i++)); do
262                 eval tmp=\"\${${1}_${i}}\"
263                 [[ -z $tmp ]] && tmp="''"
264                 echo "$tmp" | grep -e " " >/dev/null 2>&1
265                 [[ $? == 0 ]] && tmp="'$tmp'"
266                 echo -ne "$tmp"
267         done
269 arrayw ()
271         eval ${1}_${2}=${3}
273 # ${ENVAR[@]}
274 arrayall ()
276         local i
277         local cnt=$(($#-2))
279         [[ -z "$1" ]] && return
281         for ((i=2; i<$cnt; i++)); do
282                 set ${1}_$i="\$$i"
283         done
285 # export
286 array_export ()
288         local i
289         local cnt=$(($#-2))
291         [[ -z "$1" ]] && return
293         for ((i=2; i<$cnt; i++)); do
294                 export ${1}_$i
295         done