shell: better support of [[ ]] bashism

Still rather rudimentary for ash

function                                             old     new   delta
binop                                                433     589    +156
check_operator                                        65     101     +36
done_word                                            736     769     +33
test_main                                            405     418     +13
parse_stream                                        2227    2238     +11
ops_texts                                            124     133      +9
ops_table                                             80      86      +6
run_pipe                                            1557    1562      +5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 8/0 up/down: 269/0)             Total: 269 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2020-10-31 03:34:07 +01:00
parent 112453acf2
commit d2241f5902
13 changed files with 209 additions and 24 deletions

View File

@@ -0,0 +1,6 @@
1:YES
2:no
3:YES
4:YES
5:no
6:no

View File

@@ -0,0 +1,7 @@
e=''
[[ a && b ]] && echo 1:YES
[[ a && '' ]] || echo 2:no
[[ a || b ]] && echo 3:YES
[[ '' || b ]] && echo 4:YES
[[ "" || "$e" ]] || echo 5:no
[[ "" || $e ]] || echo 6:no

View File

@@ -0,0 +1,2 @@
1:YES:0
2:YES:0

View File

@@ -0,0 +1,3 @@
v='*.tests'
[[ *.tests ]]; echo 1:YES:$?
[[ $v ]]; echo 2:YES:$?

View File

@@ -0,0 +1,8 @@
1:YES:0
2:YES:0
3:YES:0
4:YES:0
5:YES:0
6:YES:0
7:YES:0
8:no:1

View File

@@ -0,0 +1,15 @@
v='*.z'
[[ a.z = *.z ]]; echo 1:YES:$?
[[ a.z == $v ]]; echo 2:YES:$?
# wildcards can match a slash
[[ a/b = a*b ]]; echo 3:YES:$?
[[ a/b == a?b ]]; echo 4:YES:$?
# wildcards can match a leading dot
[[ a/.b = a/*b ]]; echo 5:YES:$?
[[ a/.b == a/?b ]]; echo 6:YES:$?
# wildcards can be escaped
[[ abc = a*c ]]; echo 7:YES:$?
[[ abc == a\*c ]]; echo 8:no:$?

View File

@@ -0,0 +1,6 @@
1:ERR2:2
2:YES:0
3:YES:0
4:YES:0
5:no:1
6:YES:0

View File

@@ -0,0 +1,12 @@
# malformed regex
[[ a =~ * ]]; echo 1:ERR2:$?
[[ a/b =~ a.b ]]; echo 2:YES:$?
[[ a/b =~ /*b ]]; echo 3:YES:$?
v='[]b.-]'
[[ a/.b] =~ $v ]]; echo 4:YES:$?
v=']b.-'
[[ a/.b] =~ $v ]]; echo 5:no:$?
[[ a/.b] =~ [$v] ]]; echo 6:YES:$?

View File

@@ -0,0 +1,7 @@
1:YES:0
2:YES:0
3:no:1
4:YES:0
2u:YES:0
3u:YES:0
4u:YES:0

View File

@@ -0,0 +1,13 @@
# regex should accept '+' operator
[[ abcdef =~ a[b-z]+ ]]; echo 1:YES:$?
# newline matches by "match any" patterns
v='
'
[[ "$v" =~ . ]]; echo 2:YES:$?
[[ "$v" =~ "[$v]" ]]; echo 3:no:$? # hmm bash does return 1... why?
[[ "$v" =~ [^a] ]]; echo 4:YES:$?
# should work even without quotes:
[[ $v =~ . ]]; echo 2u:YES:$?
[[ $v =~ [$v] ]]; echo 3u:YES:$?
[[ $v =~ [^a] ]]; echo 4u:YES:$?