【问题标题】:Remove part of a string from a variable in bash containing a forward slash从包含正斜杠的bash中的变量中删除部分字符串
【发布时间】:2016-04-23 05:52:56
【问题描述】:

我有一个字符串数组,我想打印一个用于测试我的 C 程序的 bash 脚本。数组内容如下:

PASSED TESTS: (4)

✓ tests/test_sample_one.in
✓ tests/test_sample_two.in
✓ tests/test_sample_three.in
✓ tests/test_sample_four.in

但是我想像这样打印出来:

PASSED TESTS: (4)

✓ test_sample_one
✓ test_sample_two
✓ test_sample_three
✓ test_sample_four

这是我为打印结果而编写的部分代码。我认为这是所有相关的,但我可以根据要求发布更多代码。

我已成功使用i=${i%.*} 行删除了末尾的.in,但i=${i#*/ } 行似乎无法删除/ 之前的字符。

printf "PASSED TESTS: ($passed_tests)\n\n"
for i in "${passed_tests_arr[@]}"
do
    printf "✓ "
    i=${i%.*}
    i=${i#*/ }
    echo "$i"
done

【问题讨论】:

  • 脚本中出现空白,删除空白即可完成工作 ${i#*/}
  • @sigmalha 有效。对于这个问题,stackover flow 的适当行动方案是什么。删除问题或回答问题并提供建议,说明现在语法正确后它为什么会起作用会更好吗?

标签: bash testing split printf echo


【解决方案1】:

代码是正确的,除了第 6 行脚本中的空白。

printf "PASSED TESTS: ($passed_tests)\n\n"
for i in "${passed_tests_arr[@]}"
do
    printf "✓ "
    i=${i%.*}
    i=${i#*/ }
    echo "$i"
done

没有空格的代码是:

printf "PASSED TESTS: ($passed_tests)\n\n"
for i in "${passed_tests_arr[@]}"
do
    printf "✓ "
    i=${i%.*}
    i=${i#*/}
    echo "$i"
done

然后这段代码可以打印正确的输出:

PASSED TESTS: (4)

✓ test_sample_one
✓ test_sample_two
✓ test_sample_three
✓ test_sample_four

【讨论】:

    【解决方案2】:

    您还有一个额外的空间。
    您可以使用

    使循环更短一些
    printf "PASSED TESTS: ($passed_tests)\n\n"
    for i in "${passed_tests_arr[@]}"
    do
        # Not needed: printf "✓ "
        i=${i%.*}
        # Not needed: i=${i#*/ }
        echo "${i/ *\// }"
    done
    

    【讨论】:

    • 这里好像没有打印 ✓?
    • 我认为 ✓ 是您输入行的一部分。否则一个简单的替换似乎更好。
    • 最后一行可以换成echo "✓ ${i/ *\// }"
    • 这是可能的,但我会选择 echo "✓ ${i#*/}"
    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2015-03-28
    相关资源
    最近更新 更多