I want use complex command as fallback value, something like this, but do not treat ls -sh as single string.
"${@:-ls -sh}"
>Solution :
If args are guaranteed to not contain whitespace you can just drop the quotes. Otherwise you’ll just have to go the long way:
(( $# == 0 )) && arr=(ls -sh) || arr=("$@")
# Now use "${arr[@]}" instead of "$@"