Использование "$@"
передаст все аргументы туда, cd
где $1
будет передаваться только первый аргумент.
В твоих примерах
$ . cdtest.sh "r st"
всегда работает, когда вы передаете только один аргумент, но если вы должны передать флаг, такой как
$ . cdtest.sh -L "r st"
Только "$@"
тогда правильно выполнится, где "$1"
расширится до cd -L
полной потери каталога.
тем не мение
$ . cdtest.sh r st
Сбой в обоих случаях, так как вы передаете два параметра в cd, r
и st
это не является допустимым способом выполнения cd. Параметры разделяются пробелами, которые должны быть заключены в кавычки (как в первом примере) или экранированы ( r\ st
), чтобы рассматриваться как один аргумент.
В случае компакт - диска , однако очень редко проходить в флажками , и вы не можете передать в нескольких каталогах , так что вы не будете видеть разницу в реальном мире использование либо "$1"
или "$@"
для компакт - диска. Но для других команд , которые вы будете замечать разницу , так что лучше практика , чтобы всегда использовать , "$@"
когда вы хотите создать функцию - оболочку или сценарий , как это.
cd "$*"
также не будет работать правильно с более чем 1 аргументом.