スペースと文字を含む文字列を乾燥させますか? [コピー]

スペースと文字を含む文字列を乾燥させますか? [コピー]

Unix / Macシステム用のドキュメントを生成する「簡単な」スクリプトを作成しようとしています。必要な情報が正常に受信されましたが、情報出力に一部のスペースと文字が表示されるため、CURLを使用して作成されたWebサーバーに送信できないようです。私はたくさん試してみましたが、そのうち何も動作しないようです。

以下は、スクリプトがカールに送信するURL出力です。

"ip.ip.ip.ip/documentation/index.php?avdelning=XX&user=XXX&hostname=XXX&model=ModelName:MacminiModelIdentifier:Macmini4,1&RAM=Memory:8GB&CPU=ProcessorName:IntelCore2DuoProcessorSpeed:2.4GHzNumberofProcessors:1&CPUCORES=TotalNumberofCores:2&MACADDRESS=etherxx:xx:xx:xx:xx:xx&SERIALNUMBER=SerialNumber(system):XXXXXXXX&LASTLOGGEDIN=XXXXX

CURLを使用してこれを直接実行すると、次の文字列を使用すると機能し、エラーは発生せず、Webサーバーから情報を受け取ります。

しかし、スクリプトを使用すると動作しません。スクリプト:

#!/bin/bash

STR_RAM=$(/usr/sbin/system_profiler SPHardwareDataType | grep Memory: | sed 's/ //g');
STR_MODEL=$(/usr/sbin/system_profiler SPHardwareDataType | grep Model | sed 's/ //g');
STR_CPUNAME=$(/usr/sbin/system_profiler SPHardwareDataType | grep Processor | sed 's/ //g');
STR_CPUCORES=$(/usr/sbin/system_profiler SPHardwareDataType | grep Cores: | sed 's/ //g');
STR_SERIAL=$(/usr/sbin/system_profiler SPHardwareDataType | grep Serial | sed 's/ //g');
STR_MACADDR=$(ifconfig | grep en0 -A3 | grep ether | sed 's/ //g');
STR_LOGGEDIN=$(finger | tail -1 | sed 's/ //g');
STR_HOSTNAME=$(hostname | sed 's/ //g');

STR_URL=ip.ip.ip.ip/documentation/index.php?avdelning=$1\&user=$2\&hostname=$STR_HOSTNAME\&model=$STR_MODEL\&RAM=$STR_RAM\&CPU=$STR_CPUNAME\&CPUCORES=$STR_CPUCORES\&MACADDRESS=$STR_MACADDR\&SERIALNUMBER=$STR_SERIAL\&LASTLOGGEDIN=$STR_LOGGEDIN;


STR_URL2=$(echo $STR_URL | sed 's/ //g' | awk '{printf("\"%s\"\n", $0);}');
curl $STR_URL2;

ご覧のとおり、sedとawkを使用して複数の不要な編集内容を追加しましたが、何も機能しないようです。

次のエラーメッセージが表示されます。 awkを追加してURL文字列の前後に二重引用符を追加すると、次のメッセージが表示されます。

Could not resolve "ip.ip.ip.ip

エラーが発生せずに端末から直接カールコマンドを実行できるため、これは奇妙です。スペースなどを削除しないと、解析できない複数行のURLが生成されます。 PerlとBashでurlencodingを試してみましたが、問題は解決しないようです。

私は今これをMacで実行しています。使用法:sudo sh script.shランダム文字列ランダム文字列

編集:新しいスクリプトの出力

sudo sh script2.sh IT Denniz
curl: (3) Illegal characters found in URL
xx.xx.xx.xx/documentation/index.php?avdelning=XX&user=Denniz&hostname=admins-Mac-mini-2.local&model=ModelName:Macmini
ModelIdentifier:Macmini4,1&RAM=Memory:8GB&CPU=ProcessorName:IntelCore2Duo
ProcessorSpeed:2.4GHz
NumberofProcessors:1&CPUCORES=TotalNumberofCores:2&MACADDRESS=  etherXX:XX:XX:XX:XX&SERIALNUMBER=SerialNumber(system):XXXXXXXXXXX&LASTLOGGEDIN=adminadmins008Jun10:21

ベストアンサー1

文字列にリテラル引用符を挿入したくありません。変数の周りに引用符が必要です。私はそうします:

#!/bin/bash

hw_data=$(/usr/sbin/system_profiler SPHardwareDataType)

ram=$(grep Memory: <<<"$hw_data")
model=$(grep Model <<<"$hw_data")
cpuname=$(grep Processor <<<"$hw_data")
cpucores=$(grep Cores: <<<"$hw_data")
serial=$(grep Serial <<<"$hw_data")

macaddr=$(ifconfig | grep en0 -A3 | grep ether)
loggedin=$(finger | tail -1)
hostname=$(hostname)

avdelning=$1
user=$2

url="ip.ip.ip.ip/documentation/index.php"
url+="?avdelning=${avdelning}"
url+="&user=${user}"
url+="&hostname=${hostname}"
url+="&model=${model}"
url+="&RAM=${ram}"
url+="&CPU=${cpuname}"
url+="&CPUCORES=${cpucores}"
url+="&MACADDRESS=${macaddr}"
url+="&SERIALNUMBER=${serial}"
url+="&LASTLOGGEDIN=${loggedin}"

curl "${url// /}"
#    ^          ^   <- these are the critical quotes

引用の重要性について詳しくは、次の記事を読んでください。bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク

おすすめ記事