
Cygwinクライアントで現在実行されているスクリプトの目的のために、printfで空白文字をどのようにエスケープしますか?スペースを含む行(コマンドラインで次のように機能します)$SPCをエコーします。) はい
SPC=$(printf \\$(printf '%03o' 32))
理由がわからない場合に備えて、このコードでは Bash 4+ に依存しないように連想配列をシミュレートしようとしています。 。
完全なスクリプトは次のとおりです。
#!/bin/bash
DEFAULT_INDEX=""
LAST_INDEX=0
SPC=$(printf \\$(printf '%03o' 32))
# MICROSOFT OUTLOOK VERSIONS.
OUTLOOKS=( "Cancel^Do$SPCnot$SPCtry$SPCto$SPCsend$SPCmessage$SPCvia$SPCOutlook"
"URL^Just$SPCthe$SPCmailto$SPCURL"
"Outlook$SPC2003^C:\Program$SPCFiles\Microsoft$SPCOffice\Office12"
"Outlook$SPC2007^C:\Program$SPCFiles\Microsoft$SPCOffice\Office12"
"Outlook$SPC2010^C:\Program$SPCFiles\Microsoft$SPCOffice\Office14" )
# ITERATES THROUGH ARRAY AND MAKES NUMBERED SELECTION LIST.
printOutlooksArraySelectionList() {
LIST_TITLE="MICROSOFT OUTLOOK SELECTION LIST"
echo
printf "\t\t\E[37;1;44m%-0s %s %s %s\033[0m" $LIST_TITLE
echo
echo
DEFAULT_VALUE="Outlook 2010"
index=0
for i in "${OUTLOOKS[@]}"; do
key=${i%%^*}
value=${i##*^}
if [ "$key" == "$DEFAULT_KEY" ]; then
DEFAULT_INDEX=$index
fi
printf "\t\E[37;44m%-3s %-13s\033[0m \E[1;34;40m%-41s\033[0m\n" \
$index $key $value
echo
((index++))
done
# SETS LAST_INDEX TO INDEX VALUE OF LAST ITEM IN ARRAY.
((LAST_INDEX = index - 1))
}
printOutlooksArraySelectionList
出力は次のようになると予想されます。
MICROSOFT OUTLOOK SELECTION LIST
0 Cancel Do not try to send message via Outlook
1 URL Just the mailto URL
2 Outlook 2003 C:\Program Files\Microsoft Office\Office12
3 Outlook 2007 C:\Program Files\Microsoft Office\Office12
4 Outlook 2010 C:\Program Files\Microsoft Office\Office14
この問題を解決するために、最終的にprintfを使用せずに次のようにしました。
echo -e "\t\E[37;44m${index}\t${key}\033[0m\t\t\E[1;34;40m${value}\033[0m"
このスクリプトは私の目的には十分です。
答え1
私はあなたがしたいことを理解していません。あなたのコードは、SPC
単一の文字が空白の長さ1の文字列を設定します。これは非常に洗練されたアプローチです。SPC=" "
同様に効果的で理解しやすいです。
私はあなたのスクリプト全体を確認していませんが、後で何か間違っていることがわかりました。あなたは次のことを書きました。これは変数が定義されていないため、"URL^Just$SPCthe$SPCmailto$SPCURL"
文字列を生成します。変数拡張の後に変数名の一部である可能性がある文字が続く場合は、次のものが必要です。URL^Just
$SPCthe
$SPCmailto
$SPCURL
変数名の終わりを示します。たとえば、名前を中かっこ内に入力しますURL^Just${SPC}the${SPC}mailto${SPC}URL
。しかし、なぜ文を書かなかったのか理解できません"URL^Just the mailto URL"
。
小さなハッシュテーブルをエンコードするには、2つの配列を使用することをお勧めします。 1つはキー用、もう1つは値用です。これにより、エンコードについて心配することなく任意の文字列を保存できます。以下は、検索と追加の概要です(練習のために、keys
配列の名前をvalues
引数として残します)。
lookup () { # $1=key; set value to the value found
for ((i=1; i<=${#keys}; i++)); do
if [[ ${keys[$i]} = $1 ]]; then value=${values[$i]}; return 0; fi
done
unset value; return 1
}
add () { # $1=key $2=value
for ((i=1; i<=${#keys}; i++)); do
if [[ ${keys[$i]} = $1 ]]; then values[$i]=$2; return; fi
done
keys[$i]=$1; values[$i]=$2
}
より効率的なアプローチは、各項目をシェル変数に格納することです。たとえば、テーブルがにfoo
マッピングされると、変数が設定されます。キーを英数字でエンコードする必要がありますが、これは簡単ではありません(1つの方法は、sha1を使用してキーをハッシュし、キーをに保存し、値をに保存することです)。テーブルのキーを列挙する必要がある場合は、リストを別々に保存する必要があります。somekey
somevalue
table_foo_somekey=somevalue
table_foo_${sha1_of_somekey}_key
table_foo_${sha1_of_somekey}_key
あるいは、単純なシェルの機能以上の機能が必要な場合は、より強力なツールを使用できます。 Ksh93(pdkshではない)、bash 4、およびzshにはすべて連想配列があります。それに加えて、PerlとPythonと他の言語があります。
答え2
すでに文字列の周りに引用符を使用しているため、
$SPC
文字列に引用符は必要ありません。利益がない。あなたは必要ありませんどの定義スペースそこに。〜のようにザイルズ文字列に
like "URL^Just$SPCthe$SPCmailto$SPCURL"
存在しない変数が含まれていることを示します。変数は、どの変数名にも使用できない文字で終わる場合、または{}
asで(正しく)区切られた場合に使用されます${key}
。
答え3
私はすでにこの問題についていくつかの誤解を述べています。しかし、とにかく。
スペースを含む行(コマンドラインでecho $ SPCとして機能します)は次のとおりです。
SPC=$(printf \\$(printf '%03o' 32))
実際、行にはスペースはありません。それは拡張される
printf \\040
拡張のために良いことはありません。printf
出力をするprintf
ことはまったく良い考えではありません。
必要に応じて、印刷にスペース記号が表示されることがあります。
$> printf ' %03o\n' 32
040
先行 Null および先行 0:
$> printf "%010o\n" 32
0000000040
$> printf "% 10o\n" 32
40
UPDコメントで:
$> printf '\\%03o\n' 32
\040