【问题标题】:Checking if variable starts with another variable in bash检查变量是否以bash中的另一个变量开头
【发布时间】:2017-06-23 06:10:33
【问题描述】:

与此类似>>In bash, how can I check if a string begins with some value?,但不重复。

我有两个数组,对于第一个中的每个字符串,我想检查第二个中的字符串是否以第一个中的字符串开头。

array1=("test1","test2","test3");
array2=("test1 etc","test1 nanana","test2 zzz","test3 abracadabra");

for i in "${!array1[@]}"; do
  for j in "${!array2[@]}"; do 
    if [[ "${array1[i]}" == "${array2[j]}*" ]]; then  
      echo "array1[$i] and arry2[$j] initial matches!";
      fi; 
    done; 
done

我在if里面尝试了很多条件,比如:

if [[ "${array1[i]}" == "${array2[j]*}" ]]
if [[ "${array1[i]}" == "${array2[j]}*" ]]
if [[ "${array1[i]}" = "${array2[j]*}" ]]
if [[ "${array1[i]}" = "${array2[j]}*" ]]

同样没有引号、大括号等,都没有成功。

【问题讨论】:

    标签: arrays string bash variables comparison


    【解决方案1】:

    你的代码有一些错误,首先是bash中的数组声明:如果你不放空格,你只有一个元素。请记住在尝试其他任何操作之前始终打印变量。 来自 bash 文档:

    ARRAY=(value1 value2 ... valueN)

    然后每个值都采用 [indexnumber=] 字符串的形式。指数 编号是可选的。如果提供了它,则将该索引分配给它; 否则分配的元素的索引是最后一个的编号 分配的索引加一。声明接受此格式 也是。如果没有提供索引号,则索引从零开始。

    循环数组元素:

    for element in "${array[@]}"
    do
        echo "$element"
    done
    

    这是一个代码sn-p:

    array1=(test1 test2 test3);
    array2=(test1 etc "test1 nanana" test2zzz test3 abracadabra);
    for word1 in "${array1[@]}"; do
        for word2 in "${array2[@]}"; do 
            echo "w1=$word1, w2=$word2"
            if [[ ${word2} == ${word1}* ]]; then   
                echo "$word1 and $word2 initial matches!";
            fi;                   
        done;                         
    done 
    

    在 OP 发表评论后,我意识到他正在尝试使用索引,为此,您还必须对索引“i”和“j”使用“$”。 这是一个可行的解决方案:

    for i in "${!array1[@]}"; do
        for j in "${!array2[@]}"; do    
            echo "${array1[$i]} ${array2[$j]}"
            if [[ ${array2[$j]} == ${array1[$i]}* ]]; then
                echo "$array1[$i] and $array2[$j] initial matches!";
            fi; 
        done; 
    done
    

    【讨论】:

    • 我的代码比较长;我正在使用“readarray -t array1”来设置带有命令输出的数组,所以我以错误的方式声明了数组,但只在问题中出现 - 我的错。另外,我用了“!”在数组的前面,因为我希望“i”和“j”成为索引。但是您的解决方案也确实有效。谢谢。
    • 是的,我没有意识到您正在尝试使用索引,而我认为我的第一个解决方案使用 bash 更好,我更新了答案以包含您尝试实施的答案。
    • 完美,我的代码又出现了一个错误。非常感谢。
    猜你喜欢
    • 2011-05-24
    • 2014-05-20
    • 2021-10-28
    • 1970-01-01
    • 2011-12-19
    • 2020-01-07
    • 2020-01-16
    • 2014-09-12
    • 1970-01-01
    相关资源
    最近更新 更多