【问题标题】:variable undefined after nested for loop嵌套for循环后变量未定义
【发布时间】:2021-01-23 18:30:19
【问题描述】:

我正在尝试创建一个脚本,允许用户从已安装的卷中选择备份目标。

虽然我有一个初稿正在工作,但它有重复,我试图通过在嵌套的 for 循环中重建来删除它,但是到脚本结束时,我的变量变得未定义,我看不出我犯了什么错误制作。

为什么我的变量定义在第 19 行而不是第 27-29 行?

我是初学者,如果答案很明显,请道歉。

#!/bin/bash

VOLUMES=$(ls /volumes)

WORKING_DRIVE=
MASTER_DRIVE=
CLONE_DRIVE=

echo
for BACKUP_DESTINATION in 'Working Drive' 'Master Drive' 'Clone Drive'
do
    for VOLUME_VARIABLE in "${WORKING_DRIVE}" "${MASTER_DRIVE}" "${CLONE_DRIVE}"
    do
        echo "Select your ${BACKUP_DESTINATION}"
        echo
        select VOLUME_VARIABLE in $VOLUMES
        do
            echo
            echo "${BACKUP_DESTINATION}: $VOLUME_VARIABLE"
            echo
            break
        done
        break
    done
done

echo "Working Drive is: ${WORKING_DRIVE}"
echo "Master Drive is: ${MASTER_DRIVE}"
echo "Clone Drive is: ${CLONE_DRIVE}"

【问题讨论】:

  • 您希望echo "${BACKUP_DESTINATION}: $VOLUME_VARIABLE" 分配一个变量吗? echo 用于写入屏幕,而不是设置变量。
  • 在哪里为 $WORKING_DRIVE、$MASTER_DRIVE 和 $CLONE_DRIVE 赋值?
  • 另外,你有一个for VOLUME_VARIABLE in 循环和一个for VOLUME_VARIABLE in 循环,它们试图以相互冲突的方式设置VOLUME_VARIABLE。此外,这两个“循环”都有无条件的break 命令,因此它们实际上不会循环。这个脚本的逻辑……没有意义。
  • @Gordan Davisson,我的想法是第二个 for 循环将为 select 命令提供未定义的变量,并且通过 select 命令用户可以定义变量?第 17 行的 echo 命令(我认为)显示该变量已定义。我插入了 break 命令,因为循环会为每个目的地持续不止一次。

标签: bash for-loop undefined-variable


【解决方案1】:

你可以这样做:

#!/bin/bash

VOLUMES=$(ls /volumes)
DATA=''

function selectDestination() {
    echo "Select your ${1}"
    echo
    select VOLUME_VARIABLE in $VOLUMES
    do
        echo
        echo "${1}: $VOLUME_VARIABLE"
        echo
        break
    done

    DATA=${VOLUME_VARIABLE}
}

echo

selectDestination 'Working Drive'
WORKING_DRIVE=${DATA}
selectDestination 'Master Drive'
MASTER_DRIVE=${DATA}
selectDestination 'Clone Drive'
CLONE_DRIVE=${DATA}


echo "Working Drive is: ${WORKING_DRIVE}"
echo "Master Drive is: ${MASTER_DRIVE}"
echo "Clone Drive is: ${CLONE_DRIVE}"

【讨论】:

  • VOLUMES=$(ls /volumes)VOLUMES=(/volumes/*)select VOLUME_VARIABLE in $VOLUMESselect VOLUME_VARIABLE in "${VOLUMES[@]}"
  • 谢谢@Lucas Belfanti,这就是我希望脚本工作的方式。我还不知道函数命令,但我会学习它。我的嵌套循环想法是完全死胡同吗?
  • 好吧,您可以使用嵌套循环的想法,但您不能在每次迭代时将值分配给不同的值。您应该使用某种集合,例如数组。此外,如果您的问题得到解答,请将其标记为已回答。
猜你喜欢
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多