Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于数组选择的Bash pass参数_Bash - Fatal编程技术网

用于数组选择的Bash pass参数

用于数组选择的Bash pass参数,bash,Bash,我试图传递第二个参数以获得数组和循环槽,但我得到了以下错误:${$2[@]}:错误的替换 我的代码是: /etc/init.d/displaycameras开始c1 #!/bin/bash dis1cam1="screen -dmS dis1cam1 sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"0 0 640 428\" rtsp://myvideo --live -n -1'"; camera_feeds=(

我试图传递第二个参数以获得数组和循环槽,但我得到了以下错误:
${$2[@]}:错误的替换

我的代码是:

/etc/init.d/displaycameras开始c1

    #!/bin/bash
    dis1cam1="screen -dmS dis1cam1 sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"0 0 640 428\" rtsp://myvideo --live -n -1'";
    camera_feeds=('c1=(dis1cam1 dis1cam2 dis1cam3 dis1cam4 dis1cam5 dis1cam6 dis1cam8 dis1cam9)' 'c2=(dis2cam1 dis2cam2 dis2cam3 dis2cam4)')
    for elt in "${camera_feeds[@]}";do eval $elt;done

    # Start displaying camera feeds
    case "$1" in
    start)
    for i in "${$2[@]}"
    do
    eval eval '$'$i
    done
    echo "Camera Display 1 Started"
    ;;
有没有办法传递第二个参数来调用c2集

以这种方式工作是完美的:

        #!/bin/bash
 dis1cam1="screen -dmS dis1cam1 sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"0 0 640 428\" rtsp://myvideo --live -n -1'";

        camera_feeds=('c1=(dis1cam1 dis1cam2 dis1cam3 dis1cam4 dis1cam5 dis1cam6 dis1cam8 dis1cam9)' 'c2=(dis2cam1 dis2cam2 dis2cam3 dis2cam4)')
        for elt in "${camera_feeds[@]}";do eval $elt;done

        # Start displaying camera feeds
        case "$1" in
        start)
        for i in "${c1[@]}"
        do
        eval eval '$'$i
        done
        echo "Camera Display 1 Started"
        ;;

我强烈建议以不同的方式实施

#!/usr/bin/env bash

die() { echo "$*" >&2; exit 1; }
[[ $BASH_VERSION = [0-3]* ]] && die "Bash 4.3 or newer needed"
[[ $BASH_VERSION = 4.[0-2].* ]] && die "Bash 4.3 or newer needed"

dis1cam1() { : "code to start camera dis1cam1 here"; )
dis1cam2() { : "code to start camera dis1cam2 here"; )
# ...etc...

camera_feeds__c1=(dis1cam1 dis1cam2 dis1cam3 dis1cam4 dis1cam5 dis1cam6 dis1cam8 dis1cam9)
camera_feeds__c2=(dis2cam1 dis2cam2 dis2cam3 dis2cam4)

# here, we're showing the iterate-over-all-feeds case
# you can just set var=camera_feeds__c1 yourself if you prefer
for var in "${!camera_feeds__@}"; do  # var will be camera_feeds__c1 or camera_feeds__c2
  feed_name=${var#camera_feeds__}     # feed_name will be "c1" or "c2"
  declare -n camera_feeds=$var
  for i in "${camera_feeds[@]}"; do
    echo "Starting $i in feed $feed_name" >&2
    "$i" # look up and run code in variable named in $i
  done
  unset -n camera_feeds
done
  • “${camera\u feeds\uuuuu@}”
    扩展到名称以
    camera\u feeds\uuuuu\uuuu\uuu\uuu
    开头的shell变量列表;这就是我们两个数组的名称
  • declare-n camera\u feeds=$var
    然后使
    camera\u feeds
    成为当前正在迭代的数组的别名,这样“${camera\u feeds[@]}”中i的
    在该数组上迭代
  • unset-n摄像机馈送
    清除此关联

我强烈建议以不同的方式实施

#!/usr/bin/env bash

die() { echo "$*" >&2; exit 1; }
[[ $BASH_VERSION = [0-3]* ]] && die "Bash 4.3 or newer needed"
[[ $BASH_VERSION = 4.[0-2].* ]] && die "Bash 4.3 or newer needed"

dis1cam1() { : "code to start camera dis1cam1 here"; )
dis1cam2() { : "code to start camera dis1cam2 here"; )
# ...etc...

camera_feeds__c1=(dis1cam1 dis1cam2 dis1cam3 dis1cam4 dis1cam5 dis1cam6 dis1cam8 dis1cam9)
camera_feeds__c2=(dis2cam1 dis2cam2 dis2cam3 dis2cam4)

# here, we're showing the iterate-over-all-feeds case
# you can just set var=camera_feeds__c1 yourself if you prefer
for var in "${!camera_feeds__@}"; do  # var will be camera_feeds__c1 or camera_feeds__c2
  feed_name=${var#camera_feeds__}     # feed_name will be "c1" or "c2"
  declare -n camera_feeds=$var
  for i in "${camera_feeds[@]}"; do
    echo "Starting $i in feed $feed_name" >&2
    "$i" # look up and run code in variable named in $i
  done
  unset -n camera_feeds
done
  • “${camera\u feeds\uuuuu@}”
    扩展到名称以
    camera\u feeds\uuuuu\uuuu\uuu\uuu
    开头的shell变量列表;这就是我们两个数组的名称
  • declare-n camera\u feeds=$var
    然后使
    camera\u feeds
    成为当前正在迭代的数组的别名,这样“${camera\u feeds[@]}”中i的
    在该数组上迭代
  • unset-n摄像机馈送
    清除此关联

为什么要在这里尝试使用所有的
eval
?是为了清理多维数组,当我调用“${c1[@]}”或“${c2[@]}”时,它将执行for循环,eval是在omxplayer上启动服务,而该omxplayer正是bash的目标版本?(4.3提供了一种更好的方法)。@CharlesDuffy Bash版本是4.3.30(1)-releaseGood,那么——我的答案应该有用。你会注意到它的任何地方都没有
eval
。你为什么要在这里尝试使用所有
eval
?是为了清理多维数组,当我调用“${c1[@]}”或“${c2[@]}”时,它将执行for循环,eval是在bash的确切版本所针对的OMXPlayer上启动服务?(4.3提供了一种更好的方法)。@CharlesDuffy Bash版本是4.3.30(1)-releaseGood,那么——我的答案应该有用。你会注意到它的任何地方都没有
eval
。不,这种方式不好,因为我需要调用哪个来开始。那么?然后从参数列表中获取名称,而不是从迭代整个变量集的结果中获取名称。使用namerefs的技术在这里很重要;如果您使用
var=“camera\u feeds\uuu$2”
而不是
for
循环,则差别不大。此脚本的思想是随机启动屏幕或通过参数中的命令启动屏幕,因此第一组凸轮将停止,下一组将启动,您所做的是启动整个组,这并不好,因为我需要声明启动哪一组。确定,但是我展示的迭代变量中命名的数组的技术是完全可分离的。接受你想要的部分,放弃你不想要的部分。@ndAR,……还有另一件事——这很重要——你的反对意见都是基于你没有包含在问题中的细节,这意味着它们不是基于那些让答案没有反应的东西。这不是我的问题,你问了一个模糊的问题,没有反映出你真正想要做什么。不,这样不好,因为我需要调用wich one来开始。那么?然后从参数列表中获取名称,而不是从迭代整个变量集的结果中获取名称。使用namerefs的技术在这里很重要;如果您使用
var=“camera\u feeds\uuu$2”
而不是
for
循环,则差别不大。此脚本的思想是随机启动屏幕或通过参数中的命令启动屏幕,因此第一组凸轮将停止,下一组将启动,您所做的是启动整个组,这并不好,因为我需要声明启动哪一组。确定,但是我展示的迭代变量中命名的数组的技术是完全可分离的。接受你想要的部分,放弃你不想要的部分。@ndAR,……还有另一件事——这很重要——你的反对意见都是基于你没有包含在问题中的细节,这意味着它们不是基于那些让答案没有反应的东西。这不是我的问题,你问了一个模糊的问题,没有反映出你真正想做什么。