我想从shell脚本发送此POST请求:
start=&limit=&selectNone=true&importId=111&saveCount=&save=some+keywords+%C3%BCbernehmen&list=7947&list=7983&list=7940&list=7976&list=7953&list=7989&list=7948&list=7984&list=7925&list=7961&toggleAllSelect=on&7947-select=true&7947-id=7947&7983-select=true&7983-id=7983&7940-select=true&7940-id=7940&7976-select=true&7976-id=7976
有效的解决方案:
POSTString="--form selectNone=true --form save=some+keywords%C3%BCbernehmen --form toggleAllSelect=on"
IMPORT_ID="$(curl -s -F username=$1 -F password=$2 --form "importfile=@$3" --form importSource=$4 --form format=formatCSV $5do/ImportPersonsFile | grep 'Import-ID' | grep -Eo '[0-9]{1,10}')" echo "Import-ID: $IMPORT_ID"
duplicates="$(curl -s -F username=$1 -F password=$2 --form "importfile=@$3" --form importSource=$4 --form format=formatCSV $5do/ImportPersonsFile | grep 'Davon Dubletten' | grep -Eo '[0-9]{1,10}<' | grep -Eo '[0-9]{1,10}')"
if [ "$duplicates" -ne 0 ]; then
ids=($(curl -s -F username=$1 -F password=$2 --form "importfile=@$3" --form importSource=asds --form format=formatCSV --form importId=$IMPORT_ID --form limit=9999999 $5do/ImportPersonsEditDuplicates | grep '\-id" v' | grep -Eo '>[0-9]{1,10}<' | grep -Eo '[0-9]{1,10}'))
for id in "${ids[@]}"
do
POSTString="--form selectNone=true --form save=Als+Dublette+%C3%BCbernehmen --form toggleAllSelect=on --form list=$id --form $id-id=$id --form $id-select=true"
curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $POSTString $5do/ImportPersonsEditDuplicates > /dev/null
curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $5do/ImportPersonsFinalise > /dev/null
done
else
echo "no duplicates"
curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $5do/ImportPersonsFinalise > /dev/null
fi
echo "done"
我想要的是如下解决方案,其中字符串在for循环中组装,然后只有一个curl命令用于所有迭代。像这样的东西,不幸的是没有用。
$POSTString="--form selectNone=true --form save=some+keywords+%C3%BCbernehmen --form toggleAllSelect=on"
for id in "${ids[@]}"
do
POSTString="$POSTString --form list=$id --form $id-id=$id --form $id-select=true"
done
curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $POSTString $5do/ImportPersonsEditDuplicates > /dev/null
curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $5do/ImportPersonsFinalise > /dev/null
答案 0 :(得分:2)
在Bash中以健壮的方式存储变量列表:
POSTString=( --form selectNone=true --form save=some+keywords+%C3%BCbernehmen --form toggleAllSelect=on )
for id in "${ids[@]}"; do
POSTString+=( "${POSTString[@]}" --form list="$id" --form "$id-id=$id" --form "$id-select=true" )
done
curl -s -F username="$1" -F password="$2" --form importId="$IMPORT_ID" "${POSTString[@]}" "$5do/ImportPersonsEditDuplicates" > /dev/null
curl -s -F username="$1" -F password="$2" --form importId="$IMPORT_ID" "${POSTString[@]}" "$5do/ImportPersonsFinalise" > /dev/null
如果这确实是超出最大值的问题。命令行长度,正如您的问题标题所示(最不可能在Linux上,更可能在OS X上,甚至更可能在Cygwin上),您会看到一条错误消息,例如Argument list too long
。 [ 1]
要解决此限制,请使用curl
的{{1}}(-K
)选项,该选项指示--config
从指定文件中读取其参数,或者,如果curl
是选项参数,从stdin 帽子提示到Daniel Stenberg。
详见-
;一个潜在的缺陷是必须明确引用包含嵌入空格的选项参数。
[1]
man curl
将告诉您系统最大值的上限。命令行长度;实际限制较低,具体取决于您的环境大小
此外,某些Linux系统对参数数量以及个别参数的长度有限制。
功能