【问题标题】:bash for loop to check if directory existsbash for循环检查目录是否存在
【发布时间】:2020-08-09 07:40:26
【问题描述】:

下面的程序只是为了好玩,我正在尝试进入 bash 脚本。我不会使用脚本进行备份。

我正在尝试创建一个 for 循环来检查数组中的用户输入(将要备份的目录)是否有效。如果输入有效,则应使用它。如果不是,则应使用默认值/home/$USER 覆盖它。

echo "Please enter absolute path of directory for backup. Default is "/home/$USER
echo "You can choose multiple directories. Press CTRL-D to start backup."
read USER_DIR

# save user input into array
while read line
do
    USER_DIR=("${USER_DIR[@]}" $line)
done

# check if user input in array is valid (directory exists)
for i in ${USER_DIR[@]}
do
    if [[ -d "${USER_DIR[$i]}" ]]; then
        # directory exists
        ${USER_DIR[$i]}=${USER_DIR[$i]}
    else
        # directory does not exist
        ${USER_DIR[$i]}="/home/$USER"
    fi
done

# show content of array (check if for loop works)
echo "Backups of the following directories will be done:"
for i in ${USER_DIR[@]}; do echo $i; done

这是我得到的输出(/home/michael/Downloads 是一个目录,notadirectory 不是)

感谢您的宝贵时间。

【问题讨论】:

  • 添加一个shebang,然后将您的脚本粘贴到那里:shellcheck.net
  • 谢谢你的链接,它真的很有帮助。

标签: bash validation for-loop scripting


【解决方案1】:

在您的代码中 ${USER_DIR[$i]}=${USER_DIR[$i]} 失败。
当你想分配某些东西时,你应该删除第一个 $
您的错误较早。
你想测试目录"${USER_DIR[0]}",但你正在测试"${USER_DIR[$i]}",这是

${USER_DIR["/home/michael/Downloads"]}

试试

for i in ${#USER_DIR[@]}

for ((i=0; i<${#USER_DIR[@]}; i++))

【讨论】:

  • 谢谢,我对如何访问数组的位置感到困惑。目前,该脚本无法正常工作。它仅在我输入单个目录时才有效。按下回车键并输入下一个目录后添加特殊隐藏字符会不会有问题?
  • 在很多地方添加 `echo "${USER_DIR[@]}" `,看看哪里发生了奇怪的事情。
  • 我添加了echo "${USER_DIR[@]}" 并输入了两个有效目录。该脚本似乎连接了输入。我输入了两次/home/michael/Downloads,它显示为/home/michael/Downloads /home/michael/Downloads,中间似乎有一个空格。
  • 我认为您的回答有助于解决问题的重要部分。第一个问题是我似乎没有正确输入,因为换行符似乎不是我需要的分隔符。但无论如何它都不会起作用,因为我的循环不正确。所以你帮助解决了 50% 的问题,我会检查你的答案作为解决方案。对于另一部分,我将创建一个新问题,因为它是一个不同的问题。感谢您的帮助。
  • echo "${USER_DIR[@]}" 显示所有条目,echo "${USER_DIR[0]}" 显示第一个。
猜你喜欢
  • 1970-01-01
  • 2017-10-17
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多