シェルスクリプトでecho(およびwc)を使用せずに新しい行を印刷する方法は?

シェルスクリプトでecho(およびwc)を使用せずに新しい行を印刷する方法は?

次のスクリプトを完了しました。

#! /bin/sh  
path="foo" 
while touch $path ; do 
    path=./${path} 
done 

echo "echec avec le nom $path qui fait" 
echo $path|wc -c 
echo "caracteres"

同じ行に3つのエコー行を印刷する方法は?

答え1

echoまったく使用しない方がはるかに良いでしょう。echo任意入力と組み合わせて使用​​すると、予期しない結果が生じる可能性があります。さらに、wcシェル変数の文字数を数える必要はありません。シェルでもこれを行うことができ、起動するために別々のプロセスを実行する必要はありません。

たとえば、

そしてwc

_path=/some/place/in/my/filesystem
printf %s "$_path" | wc -c

###OUTPUT###
28

いいえwc:

printf %s "${#_path}"

###OUTPUT###
28

2つのprintf引数:

printf 'Arg char count:\t%s\nArg contents:\t%s\n' \                                                                    
    "${#_path}" "$_path"

###OUTPUT###
Arg char count: 28
Arg contents:   /some/place/in/my/filesystem

あなたの命令:

printf 'echec avec le nom %s qui fait %s caracteres\n' \
    "$_path" "${#_path}"

###OUTPUT###
echec avec le nom /some/place/in/my/filesystem qui fait 28 caracteres

バラよりなぜprintfがechoより優れているのですか?と仕様POSIX パラメータ拡張より多くの情報を知りたいです。

答え2

echoLinuxシステム1で改行を抑制するには、次のようにします-n

echo -n "echec avec le nom $path qui fait"

ただし、wc改行文字も印刷され、これを抑制することはできませんが、削除することはできます。

size=$(echo $path | wc -c);
echo "echec avec le nom $path qui fait $((size-1)) caracteres"

改行出力はエコーで計算される$((size-1))ため、ここではこれを使用しています。wc代わりにそれを使用できますが、size=$(echo -n $path | wc -c)非標準性に関する警告に注意してください-n


1. -nGNU coreutilのecho実装は非標準なのでYMMVです。幸い、ここでは実際に使用する必要はありません。

答え3

オプション-necho改行を抑制します。したがって、次のようにすることができます。

echo -n "echec avec le nom $path qui fait" 
echo -n $(echo $path|wc -c)
echo "caracteres"

関連情報