【问题标题】:How to stop a for instance bash script如何停止例如 bash 脚本
【发布时间】:2019-02-06 00:02:12
【问题描述】:

我有这个文件

$img=1.jpg,2.jpg,3.jpg,4.jpg,5.jpg,6.jpg,7.jpg

这是我的代码

# Split on the comma, and create an array
 IFS=',' read -ra images <<< "$timg"
# Start the JSON
echo "\"pictures\":["

# loop through the images, and output the JSON
# keep track of the index of output items
counter=1
for image in "${images[@]}"
do
    echo -n "    {\"source\":\"$image\"}"
    # Add a comma unless it is the last element in the array
    if [ $counter -lt ${#images[@]} ]
    then
        echo ","
    else
        echo ""
    fi
    (( counter = counter + 1 ))
done

# Close the JSON
echo "]}"

结果是

{"source":"1.jpg"},
{"source":"2.jpg"},
{"source":"3.jpg"},
{"source":"4.jpg"},
{"source":"5.jpg"},
{"source":"6.jpg"},
{"source":"7.jpg"}

我想给 for 命令只读取 x 个数字并停止。 它可能吗?谢谢 示例我只想运行前 5 个 结果愿望是:

{"source":"1.jpg"},
{"source":"2.jpg"},
{"source":"3.jpg"},
{"source":"4.jpg"},
{"source":"5.jpg"}

【问题讨论】:

  • 不要像那样手动创建 JSON。安装jq 实用程序。

标签: json bash shell loops unix


【解决方案1】:

使用jq 这几乎是微不足道的:

$ img=1.jpg,2.jpg,3.jpg,4.jpg,5.jpg,6.jpg,7.jpg
$ echo "$img" | jq -R --argjson n 5 'split(",")[:$n] | {pictures: map({source: .})}'
{
  "pictures": [
    {
      "source": "1.jpg"
    },
    {
      "source": "2.jpg"
    },
    {
      "source": "3.jpg"
    },
    {
      "source": "4.jpg"
    },
    {
      "source": "5.jpg"
    }
  ]
}

【讨论】:

    【解决方案2】:

    你可以对数组进行切片,然后循环遍历它。

    images=("${images[0]:0:5}")
    

    How to slice an array in Bash

    【讨论】:

    • 谢谢是我最喜欢的答案:)
    【解决方案3】:

    考虑以下几点:

    #!/bin/bash
    
    timg='image1.png,image2.png,image3.png,image4.png,image5.png,image6.png'
    
    # Split on the comma, and create an array
    IFS=',' read -ra images <<< "$timg"
    
    # Start the JSON
    echo '{ "pictures": ['
    
    for ((i=0; i<5 && i<${#images[@]}; i++)); do
      printf '  { "source": "%s" }\n' "${images[i]}"
    done | paste -sd ","
    
    echo ']}'
    

    输出:

    { "pictures": [
      { "source": "image1.png" },  { "source": "image2.png" },  { "source": "image3.png" },  { "source": "image4.png" },  { "source": "image5.png" }
    ]}
    

    注意事项:

    • 由于此 shell 脚本使用数组,它必须以 #!/bin/bash 开头,否则它可能由 POSIX shell 运行。
    • 考虑使用单引号,这样您就不必经常转义双引号(例如,在涉及 JSON 的 echos 上)
    • 有关for-loop 的这种更像 C 的形式的更多信息,请参阅 bash(1)
    • ${#images[@]} 计算为 images 数组中的元素数。
    • 整个for-条件将确保循环在我们位于images 数组的末尾或发出5 对象时终止。考虑将 5 设为变量,以帮助使代码更具自我记录性。
    • printf 是一种发出包含双引号但需要注入值的字符串的便捷方式。
    • paste -sd "," 将有效地 join the lines on its standard input by the provided delimiter。这有助于简化添加逗号的逻辑。

    【讨论】:

    • 不错的一个!谢谢 =)
    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2015-09-01
    • 2021-12-11
    • 2018-06-28
    • 2023-04-11
    • 2019-10-14
    相关资源
    最近更新 更多