IFS =';'读取-不拆分“;”的数组输入包含换行符时正确显示

时间:2018-09-28 13:32:47

标签: linux bash shell

我正在使用PHP,尝试将包含多个用“;”分隔的命令的单个字符串发送到Shell脚本。 (也许还有换行符)。

但是,拆分未按照IFS的预期进行。

我的输入是

"fabricSettings": [
...
    {
        "name": "ApplicationGateway/Http",
        "parameters": [
             {
                 "name": "IsEnabled",
                 "value": "false"
             }
        ]
}
],
...

但是由于某种原因,它仅将第一行保存在CMDS_ARR中

"mycommand1 '    hello word \n    ';\nmycommand2 'hello world;\nmycommand3 'bye world;\n"

输出

#!/bin/bash

COMMANDS="mycommand1 '    hello word 
    ';
mycommand2 'hello world;
mycommand3 'bye world;
"

# Delimit single-line commands by ";" into multi commands
# array $CMDS_ARR to include all commands as single input
IFS=';' read -ra CMDS_ARR <<< "$COMMANDS"

for CMD in "${CMDS_ARR[@]}"; do
    printf "THE COMMAND: *$CMD*\n"
done

1 个答案:

答案 0 :(得分:1)

使用-d选项将“换行符”设置为空字节,以便read将整个输入视为一行。

IFS=';' read -d '' -ra CMDS_ARR <<< "$COMMANDS"

为避免唯一的问题是缺少空字节来终止输入时退出状态为非零,请不要使用here字符串(不能包含空字节)。每个@CharlesDuffy有一个选项:

IFS=';' read -d '' -ra cmds_arr < <( printf '%s\0' "$COMMANDS" )

变量或硬编码的字符串不能包含空字节,但是printf的输出可以。