diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/hush.c | 17 | ||||
-rw-r--r-- | shell/hush_test/hush-vars/var1.right (renamed from shell/hush_test/hush-vars/var.right) | 0 | ||||
-rwxr-xr-x | shell/hush_test/hush-vars/var1.tests (renamed from shell/hush_test/hush-vars/var.tests) | 0 | ||||
-rw-r--r-- | shell/hush_test/hush-vars/var2.right | 2 | ||||
-rwxr-xr-x | shell/hush_test/hush-vars/var2.tests | 4 |
5 files changed, 19 insertions, 4 deletions
diff --git a/shell/hush.c b/shell/hush.c index 8be0ecf1c..b6393865b 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -587,7 +587,7 @@ static int glob_needed(const char *s) static int is_assignment(const char *s) { - if (!s || !isalpha(*s)) + if (!s || !(isalpha(*s) || *s == '_')) return 0; s++; while (isalnum(*s) || *s == '_') @@ -3529,22 +3529,24 @@ static int handle_dollar(o_string *dest, struct in_str *input) debug_printf_parse("handle_dollar entered: ch='%c'\n", ch); if (isalpha(ch)) { + i_getch(input); + make_var: o_addchr(dest, SPECIAL_VAR_SYMBOL); while (1) { debug_printf_parse(": '%c'\n", ch); - i_getch(input); o_addchr(dest, ch | quote_mask); quote_mask = 0; ch = i_peek(input); if (!isalnum(ch) && ch != '_') break; + i_getch(input); } o_addchr(dest, SPECIAL_VAR_SYMBOL); } else if (isdigit(ch)) { make_one_char_var: + i_getch(input); o_addchr(dest, SPECIAL_VAR_SYMBOL); debug_printf_parse(": '%c'\n", ch); - i_getch(input); o_addchr(dest, ch | quote_mask); o_addchr(dest, SPECIAL_VAR_SYMBOL); } else switch (ch) { @@ -3586,8 +3588,15 @@ static int handle_dollar(o_string *dest, struct in_str *input) break; } #endif - case '-': case '_': + i_getch(input); + ch = i_peek(input); + if (isalnum(ch)) { /* it's $_name or $_123 */ + ch = '_'; + goto make_var; + } + /* else: it's $_ */ + case '-': /* still unhandled, but should be eventually */ bb_error_msg("unhandled syntax: $%c", ch); return 1; diff --git a/shell/hush_test/hush-vars/var.right b/shell/hush_test/hush-vars/var1.right index 14b2314d9..14b2314d9 100644 --- a/shell/hush_test/hush-vars/var.right +++ b/shell/hush_test/hush-vars/var1.right diff --git a/shell/hush_test/hush-vars/var.tests b/shell/hush_test/hush-vars/var1.tests index 0a63696c9..0a63696c9 100755 --- a/shell/hush_test/hush-vars/var.tests +++ b/shell/hush_test/hush-vars/var1.tests diff --git a/shell/hush_test/hush-vars/var2.right b/shell/hush_test/hush-vars/var2.right new file mode 100644 index 000000000..40bf4bff4 --- /dev/null +++ b/shell/hush_test/hush-vars/var2.right @@ -0,0 +1,2 @@ +http://busybox.net +http://busybox.net_abc diff --git a/shell/hush_test/hush-vars/var2.tests b/shell/hush_test/hush-vars/var2.tests new file mode 100755 index 000000000..1292410f3 --- /dev/null +++ b/shell/hush_test/hush-vars/var2.tests @@ -0,0 +1,4 @@ +_1=http://busybox.net + +echo $_1 +echo ${_1}_abc |