注文する: val=$( echo $text $len|awk '{print substr($0,0,$2)}')
上記のコマンドはうまく動作します。 $0と$2の値が何であるかを知りたいです。 $ 0は$ textの値を受け入れ、$ 2は$ lenの値を受け入れることを知っています。しかし、1ドルはどうですか?
答え1
$0
はフルラインであり、($text
および$len
)$2
2番目の引数は($len
)
のように見えますがsubstr($0,0,$2
)でなければなりませんsubstr($1,0,$2)
が$len
、十分に小さいと(実際の長さより小さいと$text
)問題になりません。
一方では、次の点に注意してください。
val=${text:0:$len}
これにより、ほとんどのシェルで問題が解決されます。
答え2
ではなく、でawk
計算が始まるからです。最初のブロックはで、2番目のブロックはです。実際にパイプで接続するフルライン、すべてのチャンクを一緒に使用します。1
0
$1
$2
$0
awk
詳細な詳細:
さて、まず私はこのことをシェルで実行しているとします。たとえば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
文字列を返します。省略または文字列に残っている文字よりも多くの文字が指定されている場合、部分文字列の長さは文字列の長さに制限されます。s
m
1
n
n
s
したがって、まず長さパラメータの数字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