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

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

1つ目は例えば

```

          aaa    bbbbb
    
```

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

追記

```

    #!/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
    
```

最終的なコード

```

    #!/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
    
```
1 ですが、行の内容が入っているシェル変数をダブルクォートで囲みます。

```

    $ line='     aaa    bbbbb'
    $ echo $line
    aaa bbbbb
    $ echo "$line"
         aaa    bbbbb
    
```

しかし、

```

    $ line='-n'
    $ echo "$line"
    (何も表示されない)
    
```

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

```

    $ line='-n'
    $ printf '%s\n' "$line"
    -n
    
```

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

```

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

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

```

    $ tput smam
    
```

として下さい。

**追記**

以下の部分ですが、

```

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

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

```

    while IFS='' read LINE
    do
      [[ $SPACE > 0 ]] && printf "%${SPACE}s" ' '
      printf "%s\n" "$LINE"
    done < $FILE_NAME
    
```
1 ですが、行の内容が入っているシェル変数をダブルクォートで囲みます。

```

    $ line='     aaa    bbbbb'
    $ echo $line
    aaa bbbbb
    $ echo "$line"
         aaa    bbbbb
    
```

しかし、

```

    $ line='-n'
    $ echo "$line"
    (何も表示されない)
    
```

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

```

    $ line='-n'
    $ printf '%s\n' "$line"
    -n
    
```

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

```

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

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

```

    $ tput smam
    
```

として下さい。

**追記**

以下の部分ですが、

```

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

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

```

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