Bash中使用Here Tag传递多行字符串时如何自增整数
解决Here-Document中自动递增索引的问题
你当前的代码需要手动为索引添加固定偏移量,调整行序或删除行时极易出错:
index=SOME_INTEGER SOME_COMMAND <<EOF subcommand1 ${index} subsubcommand1 subcommand2 $((${index}+1)) subsubcommand2 subcommand3 $((${index}+2)) subsubcommand3 subcommand4 $((${index}+3)) subsubcommand4 subcommand5 $((${index}+4)) subsubcommand5 EOF
你尝试的$((index++))等自增写法无效,核心原因是普通无引号的Here-Document会被当前Shell一次性展开所有变量和表达式:所有自增操作都基于初始的index值计算,中间的变量修改不会影响后续展开结果,最终所有索引行都会是同一个值。
下面是几种可行的解决方案:
方案1:用循环生成命令序列(推荐)
通过循环自动生成带递增索引的命令,再通过管道传递给SOME_COMMAND,调整行序或增删行只需修改循环逻辑:
index=SOME_INTEGER # 循环生成5组命令,索引从index开始逐行递增 for i in {0..4}; do echo "subcommand$((i+1))" echo "$((index + i)) subsubcommand$((i+1))" done | SOME_COMMAND
如果需要更灵活的行控制(比如跳过某一组),可以用数组定义命令内容:
index=SOME_INTEGER # 定义需要执行的命令组,每组包含两行内容 commands=( "subcommand1" "subsubcommand1" "subcommand2" "subsubcommand2" # 可随时增删、调整此处的行 "subcommand5" "subsubcommand5" ) current_idx=$index # 遍历数组,每两个元素为一组 for ((i=0; i<${#commands[@]}; i+=2)); do echo "${commands[i]}" echo "$current_idx ${commands[i+1]}" ((current_idx++)) done | SOME_COMMAND
方案2:先构建内容到变量,再传递
如果偏好使用Here-Document/Here-String,可以先把带递增索引的内容构建到变量中,再传给命令:
index=SOME_INTEGER content="" current_idx=$index for i in {1..5}; do content+="subcommand$i"$'\n' content+="$current_idx subsubcommand$i"$'\n' ((current_idx++)) done # 用Here-String传递内容 SOME_COMMAND <<<"$content"
方案3:通过子Shell处理实时自增
如果必须在Here-Document中实现类似逻辑,可以用子Shell执行循环生成内容,再替换到Here-Document中:
index=SOME_INTEGER SOME_COMMAND <<EOF $( current=$index for i in {1..5}; do echo "subcommand$i" echo "$current subsubcommand$i" ((current++)) done ) EOF
这里的$()会执行子Shell中的循环,生成带递增索引的内容,再替换到Here-Document中传递给SOME_COMMAND。
内容的提问来源于stack exchange,提问作者MikkelDA
相关产品推荐
相关产品推荐

