用于数组选择的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@}”
开头的shell变量列表;这就是我们两个数组的名称camera\u feeds\uuuuu\uuuu\uuu\uuu
然后使declare-n camera\u feeds=$var
成为当前正在迭代的数组的别名,这样“${camera\u feeds[@]}”中i的camera\u feeds
在该数组上迭代
清除此关联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@}”
开头的shell变量列表;这就是我们两个数组的名称camera\u feeds\uuuuu\uuuu\uuu\uuu
然后使declare-n camera\u feeds=$var
成为当前正在迭代的数组的别名,这样“${camera\u feeds[@]}”中i的camera\u feeds
在该数组上迭代
清除此关联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,……还有另一件事——这很重要——你的反对意见都是基于你没有包含在问题中的细节,这意味着它们不是基于那些让答案没有反应的东西。这不是我的问题,你问了一个模糊的问题,没有反映出你真正想做什么。