bash中的条件语句和解释

时间:2017-11-08 13:10:23

标签: linux bash

#!/bin/bash

echo "Please enter your desired file type(s) from the following list

gif jpg docx

any other value than these three is also valid"

read entry1 entry2 entry3 entry4

echo your first choice was: $entry1
echo your second choice was: $entry2
echo your third choice was: $entry3
echo your fourth choice was: $entry4


if [$entry1 || $entry2 || $entry3 || $entry4 =="jpg"]

then

mkdir jpg

echo "jpg directory created"

fi

我要做的是,无论何时输入所选值,都要创建一个目录。如果输入了jpg,gif或docx:根据需要为jpg,gif或docx创建目录。 目前,无论我进入我的代码,我总是创建一个jpg目录.....即使我输入jpg,gif,docx或一些完全随机的值,如tinzebra。

我的理解是,THEN之后的声明取决于声明是真/假的情况,但看起来我的代码似乎总是将布尔解释为真......这让我非常困惑< / p>

2 个答案:

答案 0 :(得分:3)

所以,我认为你的问题在你的条件中。

该行:

if [$entry1 || $entry2 || $entry3 || $entry4 =="jpg"]

真的是说,如果设置了$ entry1,或者设置了$ entry2,或者设置了$ entry3,或者$ entry4等于“jpg”。

如果您只是在其中一个设置为jpg时尝试创建目录,请尝试将该行修改为:

if [ "$entry1" = "jpg" ] || [ "$entry2" = "jpg" ] || [ "$entry3" = "jpg" ] || [ "$entry4" = "jpg" ]

这样你检查条目1,2,3或4是否为“jpg”,创建“jpg”目录。

答案 1 :(得分:1)

你的想法是正确的,但条件和脚本其余部分的语法可以大大改进。您可以使用forwhile

简单地使用循环结构读取n个变量
declare -i input_count
input_count=4
for ((i=1; i<=input_count; i++)); do 
    var="entry_$i"
    read -p "Choose between (gif|jpg|docx) for $var: " "$var" 
done

现在我们已经存储/读取了变量,您需要使用循环再次进行检查,如果已经使用-p开关不存在则创建目录。

for ((i=1; i<=input_count; i++)); do 
    var="entry_$i"
    if [[ "${!var}" =~ ^(gif|jpg|docx)$ ]]; then
        mkdir -p "${!var}" || { printf 'error creating dir\n' >&2; exit 1; }
    fi
done

上面的代码使用bash的细节,您可以在脚本顶部将解释器指定为#!/usr/bin/env bash来运行。

相关问题