
おそらくこれは非常に愚かな質問です。私はbashスクリプトの初心者ですが、コマンドを実行しようとすると正しく動作しません。
#!bin/bash
noise={5,10,15}dB
mkdir $(echo $noise)
{5、10、15} dBが位置パラメータとして提供されるbashスクリプトに5 dB、10 dB、および15 dBの3つのディレクトリを作成したいと思います。スクリプトは中括弧拡張を実行せず、フォルダに{5、10、15} dBを提供します。誰が私を助けることができますか? ?
答え1
まず、変数に保存する必要はありません。とにかく、中かっこは変数の割り当ての右側で拡張されないため、変数はリテラルになります{5,10,15}dB
。
次のことができます。
mkdir {5,10,15}dB
また、コマンド置換で変数をエコーする必要はなく、実行された作業は変数の内容を拡張するだけです。
mkdir $(echo $noise)
以下と変わりません:
mkdir $noise
答え2
私はあなたを混乱させることが拡張順序だと思います。 Bashはこれを特定の順序で実行します。最初の中かっこ拡張、次に変数拡張です。これがあなたの例では中かっこ拡張が機能しない理由です。
eval
以下を使用してbash実行拡張を強制できます。
noise={5,10,15}dB
# BAD IDEA, FOR DEMONSTRATION PURPOSES ONLY
eval mkdir $noise
しかし、内部にマルウェアがあるとマルウェアも$noise
実行されるため、通常これは悪い習慣です。
@Archemarがコメントで指摘したように、大量により良いアイデアかもしれません。
noise=(5 10 15)
mkdir "${arr[@]/%/dB}"
コマンドラインからディレクトリ名を渡す場合、中かっこ拡張はスクリプトの呼び出し時に対話型シェルで実行されるため、問題は発生しません。つまり、次が機能します。
$ cat script.sh
#!/bin/bash
mkdir "$@"
$ ./script.sh {5,10,15}dB