Передача -e и -n в качестве позиционных параметров в Bash

Недавно я работал с позиционными параметрами в некоторых скриптах bash и заметил, что -e и -n не передаются как позиционные параметры. Я искал документацию, но не смог понять, почему. Рассмотрим следующие короткие сценарии:

#!/bin/bash
# test.sh
echo $@
echo $1
echo $2
echo $3
echo $4
echo $5
exit

Выполнение команды: # ./test.sh -e -f -c -n -g выводит:

-f -c -n -g

-f
-c
-g

./test.sh -n -f -c -e -g выводит:

-f -c -e -g-f
-c

-g

Почему -e и -n не появляются в "$@"? -e, кажется, передается как пустой параметр, и -n, кажется, удаляет следующую конечную строку. Кроме того, я заметил, что эти параметры учитываются при отображении $#. Кто-нибудь знает, почему -e и -n ведут себя не так, как другие параметры?

1 ответ

Решение

-e передается как аргумент echo и затем поглощается этим.

Попробуйте это вместо этого:

#!/bin/bash
printf '%s\n' "$1"
printf '%s\n' "$2"
printf '%s\n' "$3"
printf '%s\n' "$4"
printf '%s\n' "$5"

Выход:

-e
-f
-c
-n
-g

Проверьте help echo | less +/-e

Ты можешь использовать:

echo -- "$1"

тоже

Другое решение

используя bash здесь документ

#!/bin/bash
cat<<EOF
$1
$2
$3
$4
$5
EOF
Другие вопросы по тегам