Bashスクリプトのprintf空白文字

Bashスクリプトのprintf空白文字

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を使用してキーをハッシュし、キーをに保存し、値をに保存することです)。テーブルのキーを列挙する必要がある場合は、リストを別々に保存する必要があります。somekeysomevaluetable_foo_somekey=somevaluetable_foo_${sha1_of_somekey}_keytable_foo_${sha1_of_somekey}_key

あるいは、単純なシェルの機能以上の機能が必要な場合は、より強力なツールを使用できます。 Ksh93(pdkshではない)、bash 4、およびzshにはすべて連想配列があります。それに加えて、PerlとPythonと他の言語があります。

おすすめ記事