18830


bashのechoコマンドについて2点ほど教えていただきたく考えております。

  1. ファイルの1行をechoした時にスペースをそのまま表示するにはどうしたらいいか
  2. echoした文字列が画面からはみ出るとき自動的に折り返すようになりますが、これを抑止するにはどうするのか。

1つ目は例えば

[code]

          aaa    bbbbb
    
[/code]

のような文字列を空白を残したまま表示したいです。しかしechoで表示すると空白が消えてしまいます。  
以上2点について教えて下さい。

追記

[code]

    #!/bin/bash
    
    SPACE=90
    FILE_NAME="hoge.txt"
    COLS=`tput cols`
    CURRENT_IFS=$IFS
    IFS=''
    while [ $SPACE -gt 0 ];
    do
      while read LINE
      do
        j=0
        while [ $j -lt $SPACE ];
        do
          echo -n " "
          j=$(( j + 1))
        done
        printf "%s\n" "$LINE"
      done < $FILE_NAME
      SPACE=$(( SPACE - 1 ))
      sleep 0.5
      clear
    done
    
    IFS=$CURRENT_IFS
    
[/code]

最終的なコード

[code]

    #!/bin/bash
    
    SPACE=100
    FILE_NAME="thank_you.txt"
    COLS=`tput cols`
    while [ $SPACE -gt 0 ];
    do
      while IFS='' read LINE
      do
        j=0
        while [ $j -lt $SPACE ];
        do
          echo -n " "
          j=$(( j + 1))
        done
        MARGIN=$(( COLS - SPACE ))
        echo "$LINE" | cut -b1-$MARGIN
      done < $FILE_NAME
      SPACE=$(( SPACE - 1 ))
      sleep 0.05
      if [ $SPACE -gt 0 ]; then
        clear
      fi
    done
    
[/code]


CC BY-SA 3.0
2015-11-15T02:18:20.920
18828
2015-11-15T16:17:30.543
2015-11-15T03:40:32.747
7232
7232
question
bash shellscript
bashのechoコマンドについて教えて下さい


`echo`は渡された内容を一切変更することなく出力します。空白が消えてしまうということは、そもそも`echo`に空白が渡されていません。  
また`echo`には画面という概念もありません。画面からはみ出したくないのであれば、画面幅まで切り詰められた文字列を`echo`に渡す必要があります。

要するに、どのように`echo`を呼び出しているかの問題です。


CC BY-SA 3.0
2015-11-15T02:36:07.983
18829
2015-11-15T02:36:07.983
4236
18828
answer


1 ですが、行の内容が入っているシェル変数をダブルクォートで囲みます。

[code]

    $ line='     aaa    bbbbb'
    $ echo $line
    aaa bbbbb
    $ echo "$line"
         aaa    bbbbb
    
[/code]

しかし、

[code]

    $ line='-n'
    $ echo "$line"
    (何も表示されない)
    
[/code]

という場合がありますので、できれば `printf`(bash の builtin function) を利用する方が良いかと思います。

[code]

    $ line='-n'
    $ printf '%s\n' "$line"
    -n
    
[/code]

2 についてですが、以下は `tput` コマンドを使う方法です。

[code]

    $ echo $COLUMNS
    82
    
    $ line="$(seq -s '' 100)"
    $ printf '%s\n' "$line"
    123456789101112131415161... (snip) ...
    ...
    ...
    
    $ tput rmam; printf '%s\n' "$line"
    12345678910111213141516171819202122232425262728293031323334353637383940414243444
    
[/code]

`tput rmam` を実行することで端末の `line wrapping` を抑止します。元に戻すには、

[code]

    $ tput smam
    
[/code]

として下さい。

**追記**

以下の部分ですが、

[code]

    while read LINE
    do
      j=0
      while [ $j -lt $SPACE ];
      do
        echo -n " "
        j=$(( j + 1))
      done
      printf "%s\n" "$LINE"
    done < $FILE_NAME
    
[/code]

以下の様に書くこともできます。

[code]

    while IFS='' read LINE
    do
      [[ $SPACE > 0 ]] && printf "%${SPACE}s" ' '
      printf "%s\n" "$LINE"
    done < $FILE_NAME
    
[/code]


CC BY-SA 3.0
2015-11-15T02:36:18.300
18830
2015-11-15T03:51:46.053
2015-11-15T03:51:46.053
18828
answer


`echo` の使い方や `printf`
を使うべきなのは既にされている回答の通りですが、それ以外に提示されているスクリプトに気になった点があります。入力中のバックスラッシュが特別扱いされないように
`read` に `-r` オプションを付けましょう。


CC BY-SA 3.0
2015-11-15T16:17:30.543
18856
2015-11-15T16:17:30.543
3061
18828
answer