web-dev-qa-db-ja.com

コマンドの出力をシェル変数に格納する

結果を変数に割り当てたいcutを使用した操作があります

var4=echo ztemp.xml |cut -f1 -d '.'

エラーが発生します:

ztemp.xmlはコマンドではありません

var4の値は割り当てられません。私はそれに出力を割り当てようとしています:

echo ztemp.xml | cut -f1 -d '.'

どうやってやるの?

27
Vass

次のように割り当てを変更する必要があります。

_var4="$(echo ztemp.xml | cut -f1 -d '.')"
_

$(…)構文は command susbtitution として知られています。

39
Tok

使用しているシェルに応じて、パラメーター拡張を使用できます。たとえばbashの場合:

   ${parameter%Word}
   ${parameter%%Word}
          Remove matching suffix pattern.  The Word is expanded to produce
          a pattern just as in pathname expansion.  If the pattern matches
          a trailing portion of the expanded value of parameter, then  the
          result  of the expansion is the expanded value of parameter with
          the shortest matching pattern (the ``%'' case)  or  the  longest
          matching  pattern  (the ``%%'' case) deleted.  If parameter is @
          or *, the pattern removal operation is  applied  to  each  posi‐
          tional  parameter  in  turn,  and the expansion is the resultant
          list.  If parameter is an array variable subscripted with  @  or
          *,  the  pattern  removal operation is applied to each member of
          the array in turn, and the expansion is the resultant list.

あなたの場合、それは次のようなことをすることを意味します:

var4=ztemp.xml
var4=${var4%.*}

文字#は、文字列のプレフィックス部分で同様に動作します。

Ksh、Zsh、およびBashはすべて、別の、おそらくより明確な構文を提供します。

_var4=$(echo ztemp.xml | cut -f1 -d '.')
_

一部のフォントでは、バックティック(別名「グレーブアクセント」)が読み取れません。 $(blahblah)構文は、少なくともはるかに明白です。

一部のシェルではreadコマンドに値をパイプすることができます。

_ls -1 \*.\* | cut -f1 -d'.' | while read VAR4; do echo $VAR4; done
_
8
Bruce Ediger

これは、変数を割り当てるもう1つの方法であり、作成したすべての複雑なコードを正しく強調表示できないテキストエディターで使用すると便利です。

read -r -d '' str < <(cat somefile.txt)
echo "${#str}"
echo "$str"
3
Aquarius Power