コマンド出力で文字数を計算する必要があるスクリプトを作成しています。ステップ。
たとえば、このコマンドの出力長は10文字なので、このコマンドを使用するとreadlink -f /etc/fstab
結果を返す必要があります。10
これは、次のコードを使用して変数を保存することで達成できます。
variable="somestring";
echo ${#variable};
# 10
残念ながら、コマンドで生成された文字列に同じ式を使用すると機能しません。
${#(readlink -f /etc/fstab)};
# bash: ${#(readlink -f /etc/fstab)}: bad substitution
まず、出力を変数に保存すると、これを実行できることがわかります。
variable=$(readlink -f /etc/fstab);
echo ${#variable};
しかし、追加の手順を削除したいと思います。
可能ですか? Almquistシェル(sh)と互換性のある組み込みユーティリティまたは標準ユーティリティを使用するのが最善です。
ベストアンサー1
そしてGNU表現:
$ expr length + "$(readlink -f /etc/fstab)"
10
GNUには、次の引数が...などの演算子であっても文字列として扱うことを可能にする+
特別な機能があります。expr
expr
match
length
+
上記のコードは、出力からすべての末尾の改行文字を削除します。この問題を解決するには:
$ expr length + "$(readlink -f /etc/fstab; printf .)" - 2
10
結果が差し引かれます。2最後に改行文字と追加した文字があるからですreadlink
。.
Unicode文字列の場合、expr
文字数ではなく文字列の長さをバイト単位で返すため、機能しないようです(参照654号線)
$ LC_ALL=C.UTF-8 expr length ăaa
4
したがって、次のものを使用できます。
$ printf "ăaa" | LC_ALL=C.UTF-8 wc -m
3
フロント:
$ expr " $(readlink -f /etc/fstab; printf .)" : ".*" - 3
10
コマンド置換の前のスペースは、コマンドがそれで始まる文字列で衝突するのを防ぐため、-
3を引く必要があります。