web-dev-qa-db-ja.com

findの結果をシェルスクリプトの変数として保存する

ファイルへのパスを見つけて、その出力をシェルスクリプトの変数に保存します。具体的には、bashシェルで、

GCC_VERSION="find *-gcc"

それから

echo ${GCC_VERSION}

プリント

find some-gcc

変数GCC_VERSIONを取得して、findの出力を保持するにはどうすればよいですか? find *-gccコマンドの出力を変数GCC_VERSIONに保存する方法は次のとおりです。

echo ${GCC_VERSION}

プリント

some-gcc
5
bremen_matt

まず、findコマンドが正しくありません。現在のディレクトリで-gccで終わるすべてのファイルを検索する場合は、次のようにする必要があります。

$ find . -type f -name "*-gcc"

findの出力をGCC_VERSIONに保存するには、 process substitution を使用します。

$ GCC_VERSION=$(find . -type f -name "*-gcc")

-gccで終わるファイルが複数ある場合があるため、変数名を二重引用符で囲むことに注意してください。

$ echo "$GCC_VERSION"
./mipsel-linux-gnu-gcc
./aarch64-linux-gnu-gcc
./mips-linux-gnu-gcc
./arm-linux-gnueabihf-gcc
11

バックティックを使用する必要があります

VARIABLE=`Command`

推奨される新しいスタイルのコマンド置換構文

VARIABLE=$(Command)

両方の形式がサポートされていますが、前者のスクリプトの埋め込みには制限があります。

The Open Group Base Specifications Issue 7、2018 edition :からの引用

コマンド置換の「$()」形式は、逆引用符を使用する場合の一貫性のない動作の問題を解決します。例:

                Command               Output
                echo '\$x'              \$x
                echo `echo '\$x'`       $x
                echo $(echo '\$x')      \$x

さらに、逆引用符で囲まれた構文には、埋め込みコマンドの内容に歴史的な制限があります。新しい「$()」フォームはあらゆる種類の有効な埋め込みスクリプトを処理できますが、逆引用符付きフォームは逆引用符を含む有効なスクリプトを処理できません。たとえば、そうでなければ有効な埋め込みスクリプトは左側の列では機能しませんが、右側では機能します:

echo `                        echo $(
cat <<\eof                    cat <<\eof 
a here-doc with `             a here-doc with )
eof                           eof
`                             )

...引用の終わり。

3
variona