GNU/Linux >> Linux の 問題 >  >> Linux

bashコマンド文字列の逐語的な文字を確認するにはどうすればよいですか?

cat を使用できます -A で オプション:マニュアルから:

   -A, --show-all
          equivalent to -vET
   -E, --show-ends
          display $ at end of each line
   -T, --show-tabs
          display TAB characters as ^I
   -v, --show-nonprinting
          use ^ and M- notation, except for LFD and TAB

だから cat -A yourscrip.sh 目に見えない奇妙なキャラクターが表示されます。


1 つのオプションは、使用しようとしている文字を 16 進ビューアーまたはエディターで調べることです。 hexdump 端末に限定されている場合は、良いオプションです。

$ hexdump -Cv <<"EOF"
> [ -f /etc/openvpn/client.conf ] && echo true
> EOF
00000000  5b 20 2d 66 20 2f 65 74  63 2f 6f 70 65 6e 76 70  |[ -f /etc/openvp|
00000010  6e 2f 63 6c 69 65 6e 74  2e 63 6f 6e 66 20 5d 20  |n/client.conf ] |
00000020  26 26 20 65 63 68 6f 20  74 72 75 65 0a           |&& echo true.|
0000002d

space が 、 close-square-bracespace 正しい - 0x200x5D0x20 .

これらの値は 16 進数で表示される ASCII コードです。 0x20 の範囲外の値 - 0x7E は「印刷可能な文字」ではありません " ASCII に関する限り、おそらくコマンド ライン インターフェイスではうまく機能しません。

注: あなたの最初の「壊れた」をコピーしました " hexdump で使用する行 上記の例では、not-an-ASCII-space が何かに置き換えられています 元のソースとレンダリングされた質問の間に ASCII スペースを挿入してください。

これを繰り返すには、次の手順を実行します:

<オール>
  • hexdump -Cv <<"EOF"と入力してください Enterを押します
  • 使用したいテキストを貼り付けます
  • EOFと入力してください 独自の行に入力し、Enter を押します
  • あなたが発見したように、端末とコマンドラインインターフェイスは特殊文字をうまく処理しません。ドキュメントの書式設定に十分注意しないと、Microsoft Word (およびその他) で「スマート クォート」を使用する際にも問題が発生します。 "、全角ダッシュ、リストは続きます...

    違いを見つけましょう:(一番上は「スマート クォート」です "、一番下は "ストレート クォート ")

    $ hexdump -Cv <<"EOF"
    > “quoted string”
    > EOF
    00000000  e2 80 9c 71 75 6f 74 65  64 20 73 74 72 69 6e 67  |...quoted string|
    00000010  e2 80 9d 0a                                       |....|
    00000014
    

    ここで、開始引用符は単純な ASCII 引用符ではありません (" )、ただし Unicode / UTF-8 シリーズ - 0xE20x800x9C 、または U+201C - 端末は期待どおりに処理しません。

    cat -A の Kiwy の提案 仕事もします:

    $ cat -A <<"EOF"
    > “quoted string”
    > EOF
    M-bM-^@M-^\quoted stringM-bM-^@M-^]$
    

    注: echo "..." | hd を使用する場合 、検査しようとしている文字列の一部をbashが置き換える可能性があります。これは、スクリプトのコンポーネントを検査しようとするときに特に懸念されます。

    たとえば、試してみてください:

    $ echo "${USER}"
    attie
    
    $ echo "`whoami`"
    attie
    
    $ echo "$(whoami)"
    attie
    
    $ cat <<EOF
    > ${USER}
    > EOF
    attie
    

    これらのメソッドは、コンポーネントを関連するテキストに置き換えています。これを回避するには、次のいずれかの方法を使用します。一重引用符の使用に注意してください (' )、および「引用されたヒアドキュメント " ("EOF" ).

    $ echo '${USER}'
    ${USER}
    
    $ echo '`whoami`'
    `whoami`
    
    $ echo '$(whoami)'
    $(whoami)
    
    $ cat <<"EOF"
    > ${USER}
    > EOF
    ${USER}
    

    echo "<your command>" | hd 動作するはずです。バックスペース (0x08) またはコードが 80 以上の文字を探します。 echo "<your command>" | wc -b また、カウントが表示されているものと一致することを確認することもお勧めします。

    名前に「Office」が含まれるものによって作成されたファイルから内容をコピーすることは危険です。そのようなソフトウェアはしばしば文字を自由に置き換えるためです。同等の開閉。私がこれまでに見つけた中で最も困難なものは、ファイル名の途中に幅 0 の改行なしスペースがあることでした (3 日間のサーバー ダウンタイム...)。


    Linux
    1. Bashが色を印刷できるかどうかを確認する方法は?

    2. 文字列にBashの部分文字列が含まれているかどうかを確認する方法

    3. cat << EOFはbashでどのように機能しますか?

    1. bashのフォルダ内の各ファイルの先頭に文字列を追加するにはどうすればよいですか?

    2. bash プロンプトにアイコンを追加する方法

    3. ファイルの各行の先頭に文字列を追加するにはどうすればよいですか?

    1. Bash変数の文字数をカウントするにはどうすればよいですか

    2. シェルコマンドの出力をループするにはどうすればよいですか?

    3. bashで文字列内の単語のインデックスを見つける方法は?