首页 > 解决方案 > 如何停止例如 bash 脚本

问题描述

我有这个文件

$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 个数字并停止。它可能吗?Thx 示例我只想运行前 5 个结果期望是:

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

标签: jsonbashshellloopsunix

解决方案


这几乎是微不足道的使用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"
    }
  ]
}

推荐阅读