Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux IFS='';read-未拆分的数组&引用;输入包含换行符时正确_Linux_Bash_Shell - Fatal编程技术网

Linux IFS='';read-未拆分的数组&引用;输入包含换行符时正确

Linux IFS='';read-未拆分的数组&引用;输入包含换行符时正确,linux,bash,shell,Linux,Bash,Shell,我正在使用PHP,试图向shell脚本发送一个字符串,其中包含多个以“;”(可能还有换行符)分隔的命令 但是,拆分没有按照IFS的预期工作 我的意见是 "mycommand1 ' hello word \n ';\nmycommand2 'hello world;\nmycommand3 'bye world;\n" 但出于某种原因,它只保存CMDS_ARR中的第一行 #!/bin/bash COMMANDS="mycommand1 ' hello word ';

我正在使用PHP,试图向shell脚本发送一个字符串,其中包含多个以“;”(可能还有换行符)分隔的命令

但是,拆分没有按照IFS的预期工作

我的意见是

"mycommand1 '    hello word \n    ';\nmycommand2 'hello world;\nmycommand3 'bye world;\n"
但出于某种原因,它只保存CMDS_ARR中的第一行

#!/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

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

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

IFS=';'read-d'-ra CMDS_ARR如果您的输入实际上包含一个换行符(而不是有向图
\n
),则
read
只读取
\n
后面的空格;它永远看不到
和分词甚至从未执行过。请提供一个完整的示例,其中包括对
命令的赋值,我们可以使用该赋值来重现您的行为。您所说的是有意义的。是否应在传递给IFS之前删除换行符?这是我正在测试的输入。“wp option update key1'ohhh有一个tt x ya wala xde ALEEK\\n';\nwp option update key2'this is bro xxx';\nwp option update key3'ohmylov freakout e';\nwp option update key5'stam t yyey';\n”我的编辑是否正确捕获了
$COMMANDS
的值?这些命令是否可以包含换行符?您的注释在第一个命令中显示的是
\\n
,而不是
\n
。如果命令之间只有换行符,而命令内部没有换行符,那么解析命令列表就容易多了;用户定义的变量应使用小写字符,以避免潜在的冲突。请参阅第四段,记住设置shell变量将覆盖任何类似命名的环境变量。(包含小写字母的环境变量名称的名称空间为应用程序保留。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。)值得注意的是,这将有一个非零退出状态——如果使用
set-e
ERR
陷阱运行,应该注意这一点。(
IFS=”;“read-d'-ra array<上面的答案值得添加您的评论。谢谢。
IFS=';' read -d '' -ra cmds_arr < <( printf '%s\0' "$COMMANDS" )