【问题标题】:Command line arguments in shell scriptshell 脚本中的命令行参数
【发布时间】:2014-12-16 09:39:01
【问题描述】:

以下是迭代命令行参数并打印值的 shell 脚本

for var in "$@"
do
    echo $var
done

现在,如果我想从第二个命令行参数(第一个参数用于其他目的)进行迭代,那么在迭代中单独排除第一个参数的命令是什么?

【问题讨论】:

    标签: shell command-line-arguments


    【解决方案1】:

    使用shift:

    #!/usr/bin/env bash
    
    shift
    for var in "$@"; do
        echo "$var"
    done
    

    【讨论】:

    • 我正在尝试在 shell 脚本中初始化一个数组,例如 testArr=( "A" "B" )。但是我收到以下错误'shell1.sh:语法错误:“(”意外'。你能告诉我这个错误的原因是什么吗?
    • 你有空间吗?无论如何,请打开一个新问题。
    • in "$@" 没有用,因为它是默认值。您可以只使用: for var;做回声“$ var”;完成
    【解决方案2】:

    第一个参数在$1,这样做

    var1=$1
    

    将其存储到var1

    然后您可以使用shift“删除”第一个 arg 并仍然使用您的 for 循环:

    ~$cat s.sh
    var1=$1
    shift
    echo var1=$var1
    for var in "$@"
    do
        echo $var
    done
    ~$ ./s.sh 1 2 3
    var1=1
    2
    3
    

    来自man bash

    移位 [n]

    位置参数 n+1 ... 重命名为 $1 .... 参数 由数字 $# 到 $#-n+1 表示的未设置。 n 必须是小于或等于 $# 的非负数。如果 n 为 0,则不更改任何参数。如果 n 没有给出,则假定为 1。如果 n 大于 $#,则位置参数 没有改变。如果 n 为,则返回状态大于零 大于 $# 或小于零;否则为 0。

    【讨论】:

    • 我正在尝试在 shell 脚本中初始化一个数组,例如 testArr=( "A" "B" )。但是我收到以下错误'shell1.sh:语法错误:“(”意外'。你能告诉我这个错误的原因是什么吗?
    • 这是一个不同的问题。你检查了stackoverflow.com/questions/16486879/…tldp.org/LDP/abs/html/arrays.html 吗?
    • fredtantini:这些似乎是不同的问题。我发现能够找到初始化数组时出错的原因
    【解决方案3】:

    此示例的行为更像是标准的 unix 命令行实用程序。选项以任何顺序处理,并且可以具有修饰符。它不适用于每种情况(例如其中带有空格的修饰符),但我发现它对于我想要一些默认行为的脚本非常有用,但偶尔我想修改一个或多个参数。

    #!/bin/bash
    
    #defaults
    VAR1="Yours"
    VAR2="Mine"
    VAR3="Ours"
    SHARENICE="false"
    
    while [ $# -gt 0 ]; do
        case "$1" in
            #single parameter
            -s)  SHARENICE="true"
            shift
            ;;
            #modified parameters
            -1)  VAR1="$2"
            shift 2
            ;;
            -2)  VAR2="$2"
            shift 2
            ;;
            -3)  VAR3="$2"
            shift 2
            ;;
            #you could put a 'usage' function here,
            #or if your last parameter has no modifier,
            #like a mandatory input, it will now be at
            #$1
            *)
            break
            ;;
        esac
    done
    
    echo -n "$VAR1, $VAR2 and $VAR3.  "
    if [ "$SHARENICE" != "true" ]; then
        echo "Too bad we don't get along."
    else
        echo "Good thing we play nice!"
    fi
    

    【讨论】:

      猜你喜欢
      • 2013-03-03
      • 2010-09-07
      • 1970-01-01
      • 2021-02-04
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      相关资源
      最近更新 更多