在 Bash 中传递 -e 和 -n 作为位置参数

Posted

技术标签:

【中文标题】在 Bash 中传递 -e 和 -n 作为位置参数【英文标题】:Passing -e and -n as positional parameters in Bash 【发布时间】:2019-02-26 07:44:03 【问题描述】:

我最近一直在使用一些 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 的行为与任何其他参数不同。

【问题讨论】:

另一个使用printf '%s\n'而不是echo的理由。 嗯。 I just assigned a variable but echo $variable shows something else(针对此类问题的参考问题)目前不涉及该案例,但它应该 【参考方案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

【讨论】:

这是有道理的,因为 -e 和 -n 都是回显选项。有没有一种简单的方法可以在不使用管道的情况下移除前导 --

以上是关于在 Bash 中传递 -e 和 -n 作为位置参数的主要内容,如果未能解决你的问题,请参考以下文章

bash 在运行作为参数传递的文件时忽略 shebang

如何在bash脚本中传递变量的双引号值作为curl命令的参数?

bash:以空格作为参数传递路径?

BASH - 如果没有命令行参数作为参数传递,则抛出使用警告

解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?

如何将“=”作为参数的一部分从 Windows 的 bit-bash 传递给 .cmd 或 .bat 文件