【问题标题】:Why does "echo" ignore its first argument sometimes?为什么“回声”有时会忽略它的第一个参数?
【发布时间】:2021-06-22 18:07:39
【问题描述】:

这段代码的输出似乎取决于我给出的选项(-n-a),但我根本不明白原因。 这是代码中不起作用的部分(只是代码本身 + 输出):

#!/bin/sh

FILE="/path/to/some/textfile"

[ $# -eq 0 ] && echo "No arguments. Exiting.." && exit 1
[ $1 != "-n" ] && [ $1 != "-a" ] && echo "No new default usernames. Exiting" && exit 1
echo $@
echo
newusernames=`echo "$@"|cut -d' ' -f2-`
printf "'$newusernames' $mode as default usernames in $FILE\n"

运行它并以两种方式给出一些参数:

scriptname -a word1 word2 word3

给予:

-a word1 word2 word3

'word1 word2 word3'  as default usernames in path/to/textfile

虽然..:

scriptname -n word1 word2 word3

给予:

word1 word2 word3
'word2 word3'  as default usernames in path/to/textfile

$mode 只是一个在两种情况下都应该设置的变量。 如图所示,输出确实不同,而这不应该发生。

请注意,我知道这不是在脚本中传递 shell 参数的最正确方法。我只是想了解这种行为的原因。

【问题讨论】:

  • [ $1 != "-n" ] 引用了错误的内容。你不需要引用-n;你确实需要引用$1。因此,[ "$1" != -n ]
  • ...否则,当[ 尝试运行时,yourprogram '*' 将让* 替换为当前目录中的文件名列表。
  • 除此之外,虽然...您能否尝试重新命名,这样标题本身就是一个独立的问题?谈论“这个shell代码”的东西是一个直到之后有人点击并阅读正文才能理解的问题,但标题的目的是让某人弄清楚内容是否他们对身体很感兴趣。
  • echo $@ 同样是错误的——请参阅I just assigned a variable, but echo $variable shows something else` 上关于为什么引号对于echo 必不可少的进一步讨论

标签: shell posix command-line-arguments dash-shell


【解决方案1】:

您的第二种情况扩展为:

echo -n word1 word2 word3

echo -n 可以是特殊的(在这种情况下似乎是):它被解释为echo 的一个选项,不打印尾随换行符。

一种解决方案可能是使用

shift
newusernames=$(echo "$*")

首先删除参数,甚至更健壮:

shift
newusernames=$(printf '%s' "$*")

在 Bash 中,您会拥有更高级的选项,例如

printf -v newusernames '%s' "${*:2}"

一步到位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多