我正在使用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
答案 0 :(得分:1)
使用-d
选项将“换行符”设置为空字节,以便read
将整个输入视为一行。
IFS=';' read -d '' -ra CMDS_ARR <<< "$COMMANDS"
为避免唯一的问题是缺少空字节来终止输入时退出状态为非零,请不要使用here字符串(不能包含空字节)。每个@CharlesDuffy有一个选项:
IFS=';' read -d '' -ra cmds_arr < <( printf '%s\0' "$COMMANDS" )
变量或硬编码的字符串不能包含空字节,但是printf
的输出可以。