【问题标题】:How to create a string=$* without arguments $1 and $2如何创建不带参数 $1 和 $2 的字符串=$*
【发布时间】:2020-01-26 21:53:53
【问题描述】:

我有一个包含多个参数的脚本。

我需要除了$1$2 之外的所有内容。

我试过这个:

message="$*"
words= $(grep -v "$2"|"$3" $message)

但它不起作用,它给了我错误:

./backup: line 26: First: command not found

【问题讨论】:

  • 你能举一个脚本参数的例子吗?
  • 你为什么不shift 2???
  • @oguzismail 也许是因为他们不知道shift
  • 您收到此“First: command not found”错误,因为您将grep -v "$2" 的输出通过管道传输到"$3" $message"$3" 大概是First,它找不到命令名为First
  • 您想输入words=$(...)。 (= 之前没有空格)。但下面的其他答案是更好的 shell 脚本风格。祝你好运。

标签: linux bash unix arguments


【解决方案1】:

使用shift 2 移动参数(它会删除第一个 n 个参数)。 如果您以后需要"$1""$2",请先将它们保存在变量中。

请注意,在 shell 中,对变量的赋值不能在 = 的任何一侧有空格。

First=$1
Second=$2
shift 2
Message=$@

【讨论】:

    【解决方案2】:

    也许是这样的?

    [root@tsekmanrhel771 ~]# cat ./skip1st2.sh
    #!/bin/bash
    
    COUNT=0
    
    for ARG in "$@"
    do
        COUNT=$[COUNT + 1]
    
        if [ ${COUNT} -gt 2 ]; then
            RESULT="${RESULT} ${ARG}"
        fi
    done
    
    echo ${RESULT}
    
    [root@tsekmanrhel771 ~]# ./skip1st2.sh first second third 4 5 6 7
    third 4 5 6 7
    

    【讨论】:

      【解决方案3】:

      你可以使用子数组:

      $ set -- arg1 arg2 arg3 arg4
      $ str=${*:3}
      $ echo "$str"
      arg3 arg4
      

      通常情况下,将参数保留为单独的元素是一种很好的做法,您可以通过使用 $@ 并分配给新数组来做到这一点:

      $ arr=("${@:3}")
      $ declare -p arr
      declare -a arr=([0]="arg3" [1]="arg4")
      

      请注意,在 str=${*:3} 中,引号不是必需的,但在 arr=("${@:3}") 中,它是(或者参数将在空格上拆分)。


      至于你的错误信息:你的命令

      words= $(grep -v "$2"|"$3" $message)
      

      执行以下操作:

      • 它将变量words设置为命令环境的空字符串(因为=后面有一个空格)。
      • 它试图建立一个由两个命令组成的管道,grep -v "$2""$3" $message。这些命令中的第一个将挂起并等待输入;第二个尝试将$3 的内容作为命令运行;据推测,根据您的错误消息,$3 包含First
      • 如果管道实际运行,其输出将作为命令运行(同样是因为 = 右侧的空白)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 2015-09-24
        相关资源
        最近更新 更多