186 lines
3.7 KiB
YAML
186 lines
3.7 KiB
YAML
name: "Compound commands: case"
|
|||
|
|
cases:
|
||
|
|
- name: "Basic case statement with double semi"
|
||
|
|
test_files:
|
||
|
|
- path: "script.sh"
|
||
|
|
contents: |
|
||
|
|
case x in
|
||
|
|
x) echo hi;;
|
||
|
|
esac
|
||
|
|
args: ["./script.sh"]
|
||
|
|
|
||
|
|
- name: "Basic catch-all pattern against multi-line input"
|
||
|
|
stdin: |
|
||
|
|
case "$(echo hi; echo there)" in
|
||
|
|
"not-it") echo "did not work" ;;
|
||
|
|
*) echo "caught it" ;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
- name: "One-line case statement with double semi"
|
||
|
|
stdin: |
|
||
|
|
case x in x) echo "hi";; esac
|
||
|
|
|
||
|
|
- name: "Interesting characters in cases"
|
||
|
|
stdin: |
|
||
|
|
case "{" in
|
||
|
|
{) echo "curly brace" ;;
|
||
|
|
*) echo "unhandled case" ;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
- name: "Case with case insensitive pattern"
|
||
|
|
stdin: |
|
||
|
|
shopt -s nocasematch
|
||
|
|
case "A" in
|
||
|
|
a) echo "matched" ;;
|
||
|
|
*) echo "did not match" ;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
- name: "Interesting patterns in cases"
|
||
|
|
stdin: |
|
||
|
|
for word in "-a" "!b" "*c" "(d" "{e" ":f" "'g"; do
|
||
|
|
case "${word}" in
|
||
|
|
\!*) echo "starts with exclamation" ;;
|
||
|
|
-*) echo "starts with hyphen" ;;
|
||
|
|
\**) echo "starts with asterisk" ;;
|
||
|
|
\(*) echo "starts with open parenthesis" ;;
|
||
|
|
\{*) echo "starts with open curly brace" ;;
|
||
|
|
:*) echo "starts with colon" ;;
|
||
|
|
\'*) echo "starts with single quote" ;;
|
||
|
|
*) echo "unhandled case" ;;
|
||
|
|
esac
|
||
|
|
done
|
||
|
|
|
||
|
|
- name: "Empty case"
|
||
|
|
stdin: |
|
||
|
|
myfunc() {
|
||
|
|
case abc in
|
||
|
|
*b*) ;;
|
||
|
|
*) return 33;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
echo "Dropped out"
|
||
|
|
}
|
||
|
|
|
||
|
|
myfunc
|
||
|
|
|
||
|
|
- name: "Case with non-dsemi"
|
||
|
|
stdin: |
|
||
|
|
case "b" in
|
||
|
|
a) echo "a";;
|
||
|
|
b) echo "b"
|
||
|
|
esac
|
||
|
|
|
||
|
|
- name: "Case with fall-through"
|
||
|
|
stdin: |
|
||
|
|
case "b" in
|
||
|
|
a) echo "a";;
|
||
|
|
b) echo "b";&
|
||
|
|
c) echo "c";;
|
||
|
|
d) echo "d";;
|
||
|
|
esac
|
||
|
|
|
||
|
|
- name: "Case with resuming switch"
|
||
|
|
stdin: |
|
||
|
|
case "b" in
|
||
|
|
a) echo "a";;
|
||
|
|
b) echo "b";;&
|
||
|
|
c) echo "c";;
|
||
|
|
*) echo "*";;
|
||
|
|
d) echo "d";;
|
||
|
|
esac
|
||
|
|
|
||
|
|
- name: "Case status values"
|
||
|
|
stdin: |
|
||
|
|
function yield() {
|
||
|
|
return $1
|
||
|
|
}
|
||
|
|
|
||
|
|
case "a" in
|
||
|
|
x) yield 10;;
|
||
|
|
a) yield 11;;
|
||
|
|
b) yield 12;;
|
||
|
|
esac
|
||
|
|
echo "1: $?"
|
||
|
|
|
||
|
|
case "a" in
|
||
|
|
b) yield 10;;
|
||
|
|
c) yield 11;;
|
||
|
|
esac
|
||
|
|
echo "2: $?"
|
||
|
|
|
||
|
|
case "a" in
|
||
|
|
a) yield 10;&
|
||
|
|
b) yield 11;;
|
||
|
|
c) yield 12;;
|
||
|
|
esac
|
||
|
|
echo "3: $?"
|
||
|
|
|
||
|
|
case "a" in
|
||
|
|
a) yield 10;;&
|
||
|
|
*) yield 11;;
|
||
|
|
x) yield 12;;
|
||
|
|
esac
|
||
|
|
echo "4: $?"
|
||
|
|
|
||
|
|
- name: "Case with reserved words"
|
||
|
|
stdin: |
|
||
|
|
case case in
|
||
|
|
case) echo "saw case";;
|
||
|
|
esac
|
||
|
|
|
||
|
|
- name: "Case with return in function"
|
||
|
|
stdin: |
|
||
|
|
f() {
|
||
|
|
case "a" in
|
||
|
|
a) echo "matched a"; return 42;;
|
||
|
|
b) echo "matched b";;
|
||
|
|
esac
|
||
|
|
echo "After case"
|
||
|
|
}
|
||
|
|
f
|
||
|
|
echo "Exit code: $?"
|
||
|
|
|
||
|
|
- name: "Case with exit"
|
||
|
|
stdin: |
|
||
|
|
case "a" in
|
||
|
|
a) echo "matched a"; exit 42;;
|
||
|
|
b) echo "matched b";;
|
||
|
|
esac
|
||
|
|
echo "After case"
|
||
|
|
|
||
|
|
- name: "Case with break in loop"
|
||
|
|
stdin: |
|
||
|
|
for i in 1 2 3; do
|
||
|
|
case "$i" in
|
||
|
|
1) echo "one";;
|
||
|
|
2) echo "two"; break;;
|
||
|
|
3) echo "three";;
|
||
|
|
esac
|
||
|
|
echo "After case iteration $i"
|
||
|
|
done
|
||
|
|
echo "After loop"
|
||
|
|
|
||
|
|
- name: "Case with continue in loop"
|
||
|
|
stdin: |
|
||
|
|
for i in 1 2 3; do
|
||
|
|
case "$i" in
|
||
|
|
1) echo "one";;
|
||
|
|
2) echo "two"; continue;;
|
||
|
|
3) echo "three";;
|
||
|
|
esac
|
||
|
|
echo "After case iteration $i"
|
||
|
|
done
|
||
|
|
echo "After loop"
|
||
|
|
|
||
|
|
- name: "Case with return and fall-through"
|
||
|
|
stdin: |
|
||
|
|
f() {
|
||
|
|
case "a" in
|
||
|
|
a) echo "matched a"; return 42;&
|
||
|
|
b) echo "matched b";;
|
||
|
|
esac
|
||
|
|
echo "After case"
|
||
|
|
}
|
||
|
|
f
|
||
|
|
echo "Exit code: $?"
|