当前位置: 首页 > 知识库问答 >
问题:

bash脚本中$@和$*之间的差异[重复]

安建木
2023-03-14

下面有4个bash片段。我用<代码>打电话给他们。/script.sh a b c

for arg in $@; do 
echo "$arg"
done   ## output "a\nb\nc"

for arg in "$@"; do
echo "$arg"
done  ## output "a\nb\nc" -- I don't know why

for arg in $*; do
echo "$arg"
done  ##    output "a\nb\nc"

for arg in "$*"; do
echo "$arg"
done    ## output "abc"

我不知道 $@$* 之间的确切区别是什么,我认为“$
@”和“$*”应该是一样的,但它们不是。为什么?

共有3个答案

东方旭东
2023-03-14

这在shell脚本中很重要:例如脚本testargs.sh

#! /bin/bash -p

echo $#

for i in $(seq 1 $#)
do
    echo "$i: ${!i}"
done

for val in "$@"; do
    echo "in quote @, $val"
done

for val in "$*"; do
    echo "in quote *, $val"
done

for val in $@; do
    echo "not in quote @, $val"
done

for val in $*; do
    echo "not in quote *, $val"
done

如果此脚本以/tmp/testargs.shb c'd e'执行,结果是:

4
1: a
2: b
3: c
4: d e
in quote @, a
in quote @, b
in quote @, c
in quote @, d e
in quote *, a b c d e
not in quote @, a
not in quote @, b
not in quote @, c
not in quote @, d
not in quote @, e
not in quote *, a
not in quote *, b
not in quote *, c
not in quote *, d
not in quote *, e

因此,如果要保留参数的数量,请始终使用“$@”或使用$(seq 1$#)循环中的for i遍历每个参数。没有引号,两者是相同的。

相德宇
2023-03-14

$*和$@之间的区别::

“$*” 所有位置参数(作为单个单词)*

“$@”所有位置参数(作为单独的字符串)

如果使用 .//my_c $@ 将提供给 bash 脚本的三个命令行参数传递给 C 程序

你得到结果ARG[1]=="par1"ARG[2]=="par2"ARG[3]=="par3"

如果使用./my_c$*将给予bash脚本的三个命令行参数传递给C程序,

您会得到结果< code > ARG[1]= = " par 1 par 2 par 3 "

百里沛
2023-03-14

如果您有脚本 foo.sh

asterisk "$*"
at-sign "$@"

并调用它:

./foo.sh "a a" "b b" "c c"

它相当于:

asterisk "a a b b c c"
at-sign "a a" "b b" "c c"

没有引号,它们是相同的:

asterisk $*
at-sign $@

相当于:

asterisk "a" "a" "b" "b" "c" "c"
at-sign "a" "a" "b" "b" "c" "c"
 类似资料:
  • 问题内容: 我有两个时间字符串;例如。同一天的“ 09:11”和“ 17:22”(格式为hh:mm)。如何计算这两者之间的时间差(以分钟为单位)? 标准库可以这样做吗? 例: 给定hh:mm中的小时和分钟,是否有更简单的方法来执行此操作 问题答案: 一个纯bash解决方案: 使用的另一种解决方案(我们使用小时/分钟,因此日期并不重要) 参见http://en.wikipedia.org/wiki/

  • 我注意到以下代码在netbeans中是完全合法的: 然而eclipse对此并不满意,我必须这样初始化它: 有趣的是netbean建议不要在初始化部分指定类型参数,而是使用菱形运算符??我想知道这两种方法之间的区别。以及应该使用哪一种,这样代码就可以在不同的IDE中使用而不会有任何变化。

  • 问题内容: 我一直认为,子shell程序不是子进程,而是同一进程中的另一个shell程序环境。 我使用一组基本的内置函数: 在另一个终端上: 因此,kornShell(ksh)中没有子进程。 输入bash,使用相同的命令,其行为似乎有所不同: 因此,bash中的一个子进程。 通过阅读bash手册页,很明显,为子shell创建了另一个进程,但是它伪造了$$,这很时髦。 是bash和ksh之间的区别是

  • 本文向大家介绍成本差异和进度差异之间的差异,包括了成本差异和进度差异之间的差异的使用技巧和注意事项,需要的朋友参考一下 对于任何应用程序或专门用于任何项目,最关注的因素之一是在开发前和开发后阶段的预算管理和时间管理。因此,要评估任何项目的这两个主要因素,有很多方法,其中成本差异和进度差异是两个重要且主要的方法。 顾名思义,“成本差异”基于项目开发中花费的成本,而“进度差异”则基于相同开发中花费的时

  • 我想知道更多处理数组的numpy。我发现a[:,None]和a[:,]之间是不同的。我想深入研究何时何地使用它们。 我试图以特殊的方式解决从2d数组中减去1d的问题,就像numpy-subtract-add-1d-array-from-2d-array一样,我意识到a[:,None]和a[:,]是不同的。 有人能给我关于它的官方或具体参考吗?我真的会很感激你的!

  • 发送表单数据时使用命令名称和模型属性有什么区别? 和 我应该在哪个时间点使用它们中的任何一个?