詳細な詳細:

詳細な詳細:

注文する: val=$( echo $text $len|awk '{print substr($0,0,$2)}')

上記のコマンドはうまく動作します。 $0と$2の値が何であるかを知りたいです。 $ 0は$ textの値を受け入れ、$ 2は$ lenの値を受け入れることを知っています。しかし、1ドルはどうですか?

答え1

  • $0はフルラインであり、($textおよび$len
  • $22番目の引数は($len

のように見えますがsubstr($0,0,$2)でなければなりませんsubstr($1,0,$2)$len、十分に小さいと(実際の長さより小さいと$text)問題になりません。

一方では、次の点に注意してください。

val=${text:0:$len}

これにより、ほとんどのシェルで問題が解決されます。

答え2

ではなく、でawk計算が始まるからです。最初のブロックはで、2番目のブロックはです。実際にパイプで接続するフルライン、すべてのチャンクを一緒に使用します。10$1$2$0awk

詳細な詳細:

さて、まず私はこのことをシェルで実行しているとします。たとえばbash、その部分はval=$( echo $text $len|awk '<awk-script>')シェルによって解釈され、{print substr($0,0,$2)}実際のawkスクリプトにすぎません。

man awkそれでは、awk()のマンページを見てみましょう。

awkユーティリティは、レコードの最初のフィールド$1、2番目のフィールド$2などを表す必要があります。この記号は$0全体の履歴を示します[...]。

そして

substr(s, m[, n ])
位置から始まり、番号付きの最大2文字の部分n文字列を返します。省略または文字列に残っている文字よりも多くの文字が指定されている場合、部分文字列の長さは文字列の長さに制限されます。sm1nns

したがって、まず長さパラメータの数字substrで始まるので、代わりに使用する方が1良いことに注意してください。substr($0,1,$2)substr($0,0,$2)

$textしたがって、(例では)パイプする最初のチャンクawkは文字列であり、2番目の「チャンク」($len例では)は文字数を表す整数でなければなりません。すべてのブロックを一緒に、返す最初の文字から始めます。

いいですね。それでは、次のことを試してみてください。

echo ABCDEFGHIJKLMNOPQRSTUVWXYZ 2 | awk '{print substr($0,1)}'

与えられた

ABCDEFGHIJKLMNOPQRSTUVWXYZ 2

今すぐいっぱい入力する。

echo ABCDEFGHIJKLMNOPQRSTUVWXYZ 2 | awk '{print substr($1,1)}'

与えられた

ABCDEFGHIJKLMNOPQRSTUVWXYZ

つまり、完全な最初のブロックです。

だから

echo ABCDEFGHIJKLMNOPQRSTUVWXYZ "${len}" | awk '{print substr($0,1,$2)}'

提供される最初の$len文字ABCDEFGHIJKLMNOPQRSTUVWXYZ "$len"はテキスト自体です。そしてこれ$len

$len持っている最初の文字だけが必要な場合は、$text以下を試してください。

val=$( echo $text $len|awk '{print substr($1,1,$2)}')

つまり、awkスクリプトでは$0$1

また、二重引用符を使用してシェル引数を「エスケープ」することも検討してください。

val="$(echo "$text" "$len" | awk '{print substr($1,1,$2)}')"

一般的に、それは人々が望むものです(少なくとも$([...])全体の内容とその周りの引用はスキップできます)$text$len

関連情報